版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40646143/article/details/85081252
结构型模式:
- 核心作用: 是从程序结构上实现松耦合 , 从而可以扩大整体类结构 , 用来解决更大的问题 。
- 分类 适配器模式 代理模式 桥接模式 装饰模式 组合模式 外观模式 享元模式
在生活的场景如
假如 笔记本要用usb接口连接一个圆形键盘接口 绘图如下
什么是适配器模式?
- 将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的哪些类可以在一起工作 。
模式中的角色
- 目标接口(Target) : 客户所期待的接口 。 目标可以是具体的或抽象的类 , 也可以是接口 。
- 需要适配的类 (Adaptee) : 需要适配的类或适配者类 。
- 适配器(Adapter) : 通过包装一个需要适配的对象 , 把原接口转换成目标借口 。
第一种实现适配器模式
1), 创建圆形接口的键盘类 keyboard
/** PS/2 键盘 用于打字
* @author 晓电脑
*/
public class keyboard {
public void writer(){
System.out.println("我用来打字");
}
}
2), 创建适配器接口类 Request
/** 适配器接口类
* @author 晓电脑
*/
public interface Request {
void handleRequest();
}
3), 创建适配器接口实现类 Adapter
/**适配器 相当于 usb与PS/2转接口
* 使用继承的方式来实现
* 缺点: java 是单继承 但你想继承别的类无法继承
* @author 晓电脑
*/
public class Adapter extends keyboard implements Request{
@Override
public void handleRequest() {
writer();
}
}
4),创建笔记本类 来进行测试 ClientComputer
/**
* 相当于笔记本电脑
*
* @author 晓电脑
*/
public class ClientComputer {
public void test(Request request) {
//调用适配器接口 转换成客户需要的类
request.handleRequest();
}
public static void main(String[] args) {
ClientComputer computer = new ClientComputer();
Request request=new Adapter();
computer.test(request);
}
}
绘制的uml图
这样存在一个弊端: 因为java是单继承,你Adapter如果继承了这个类,就无法继承其他类了所以说这种方式不推荐使用。
第二种实现方式(推荐使用)
把Adapter类改动如下
/**以组合的方式跟被适配器对象整合
* @author 晓电脑
*/
public class Adapter implements Request {
private keyboard keyboard;
public Adapter(keyboard keyboard) {
this.keyboard = keyboard;
}
@Override
public void handleRequest() {
keyboard.writer();
}
}
- 在使用适配器的时候直接传入你想要转成的类
- 这种方式没有使用继承, 灵活
2),客户端进行测试 ClientComputer
/**
* 相当于笔记本电脑
*
* @author 晓电脑
*/
public class ClientComputer {
public void test(Request request) {
//调用适配器接口 转换成客户需要的类
request.handleRequest();
}
public static void main(String[] args) {
ClientComputer computer = new ClientComputer();
computer.test(new Adapter(new keyboard()));
}
}
绘制的uml图如下
工作中使用的场景
- 经常用来做旧系统改造和升级
- 如果我们的系统开发之后再也不需要维护 ,那么很多模式都是没必要的,但是不幸的是,事实却是维护一个系统的代价往往是开发一个系统的数倍
我们学习中见过的场景
- java.io.InputStreamReader(InputStream)
- java.io.OutputStreamWriter(outputStream)