0
点赞
收藏
分享

微信扫一扫

设计模式之适应设计模式_Adapter模式_加一个适配器以便复用


前言

​​博主github​​

​​博主个人博客http://blog.healerjean.com​​

1、Adapter模式有两种

1、类适配器模式(使用继承的适配器)

2、对象适配器 (使用委托的适配器)

1.2、适配器模式和装饰器模式的区别

装饰器与适配器都有一个别名叫做 包装模式(Wrapper),它们看似都是起到包装一个类或对象的作用,但是使用它们的目的很不一一样。

适配器模式将一个接口转变成另一个接口,它的目的是通过改变接口来达到重复使用的目的。当然也有适配之前的,并且创建跟多的方法。 因为新旧接口不一致导致出现了客户端无法得到满足的问题,但是,由于旧的接口是不能被完全重构掉的(比如不是我们代码中,而是别的jar包的对象),因为我们还想使用实现了这个接口的一些服务。那么为了使用以前实现旧接口的服务,我们就应该把新的接口转换成旧接口;实现这个转换的类就是抽象意义的转换器

装饰器模式不是要改变被装饰对象的接口,而是恰恰要保持原有的接口,但是增强原有对象的功能,或者改变原有对象的处理方式而提升性能。所以这两个模式设计的目的是不同的。

2、实例程序

现在实际情况是 我们的电压是100V的,但是我们想要的是220V的电压,现在我们希望底层还是用它,也就是说基于100V 的实现,但是我们以后都不会再用着100V了

1、实际情况

1.1.1、实际情况Banner

/**
* 目前的实际情况
*/
public class Banner {

public String string;

public Banner(String string) {
this.string = string;
}
public void showWithParen() {
System.out.println("(" + string + ")");
}
public void showWithAster() {
System.out.println("*" + string + "*");
}
}

1.1.2、测试Main

public class Main {
public static void main(String[] args) {

Banner s = new Banner("\"Hello\"") ;
s.showWithAster();
s.showWithParen();
}

2、第一种:使用继承的适配器

[外链图片转存失败(img-Y5DWBsbr-1566550452735)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages/1558686754766.png)]

1.2、​​Print​​ 接口

public interface  Print {

void printWeak();

void printStrong();
}

1.3、​​PrintBanner​​ 适配器,继承实现

适配器继承上面的banner,这样就具备了banner里面的公共属性

/**
* 适配器角色
*/
public class AdapterPrintBanner extends Banner implements Print {


public AdapterPrintBanner(String string) {
super(string);
}

@Override
public void printWeak() {
showWithParen();
}

@Override
public void printStrong() {
showWithAster();
}
}

1.4、测试Main

public class Main {

public static void main(String[] args) {


Print p = new AdapterPrintBanner("Hello");

p.printWeak();

p.printStrong();

}
}

3、第二种:使用委托的适配器

3.1、​​Print​​ 抽象类

public interface  Print {

void printWeak();

void printStrong();
}

3.2、AdapterPrintBanner 适配器委托实现

/**
* 适配器,委托实现,聚合
*/
public class AdapterPrintBanner implements Print {

private Banner banner;

public AdapterPrintBanner(String string) {
this.banner = new Banner(string);
}

@Override
public void printWeak() {
banner.showWithParen();
}

@Override
public void printStrong() {
banner.showWithAster();
}
}

3.2、测试Main

public class Main {

public static void main(String[] args) {

Print p = new AdapterPrintBanner("Hello");

p.printWeak();

p.printStrong();
}
}

4、现在的情况

我们使用的是Print接口来进行编程的,对于Mian而言,Banner类中的被隐藏起来了,这就比如是220V的工作了起来,但是实际上是100V的电压转化而成的。

5、UML

4…1、 类适配器模式(使用继承)

设计模式之适应设计模式_Adapter模式_加一个适配器以便复用_适配器模式

4.2、对象适配器模式(使用委托)

[外链图片转存失败(img-LrxLbqlj-1566550452737)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages/1558689101738.png)]

5、Adapter登场角色

5.1、Target(对象)

该角色负责定义所需要的方法,示例程序中​​Print​​所扮演的角色

5.2、Client(请求者)

该角色负责使用​​Target​​​角色所定义的方法进行具体处理,示例程序中的​​Main​​扮演这个角色

5.3、Adapter (适配器 )

该角色是主人公,使用Adaptee角色的方法匹配旧的需求,然后​​实现​​​或者​​继承​​Print来满足现状的需求

5.4、Adaptee(被适配)

该角色是被适配的角色

在继承中是被继承 、在委托中是被聚合

设计模式之适应设计模式_Adapter模式_加一个适配器以便复用_github_02


举报

相关推荐

0 条评论