设计模式之适应设计模式_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、 类适配器模式(使用继承)
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(被适配)
该角色是被适配的角色
在继承中是被继承 、在委托中是被聚合
感兴趣的,欢迎添加博主微信
哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。
请下方留言吧。可与博主自由讨论哦
微信 | 微信公众号 | 支付宝 |
---|---|---|