目录
1.定义:适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
1.定义:将抽象部分与实现部分分离,使它们都可以独立的变化。
1.定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
1.定义:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
1.什么是设计模式?
设计模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次地重用那些已有的成功的解决方案,无须再重复相同的工作
2.结构型模式
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
3适配器模式 Adapter:适配器
1.定义:适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
2.示例: 中国 民用电压220V,手机充电电压5.5V,就要有一个适配器将200v 转化为 5V。
3.优点:
1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用。
3、增加了类的透明度。
4、灵活性。
缺点:
1、过多地使用适配器,会让系统非常零乱,不易整体进行把握
2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类
- 分类
- 类适配器模式
Adapter 类,通过继承 source 类,实现 Destination 类接口,完成 source->Destination 的适配。
- 对象适配器模式
将 Adapter 类作修改,不是继承 source 类,而是持有 source 类的实例,以解决兼容性的问题。 即:持有 source 类,实现 Destination 类接口,完成source->Destination 的适配
- 接口适配器模式
当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求
适用于一个接口不想使用其所有的方法的情况
public class Voltage220V {
private double voltage;
public Voltage220V() {
this.voltage = 220;
}
public double getVoltage() {
return voltage;
}
public void setVoltage(double voltage) {
this.voltage = voltage;
}
}
/**
* 目标接口
*/
interface Voltage5V{
double getVoltage();
}
/**
* 适配器:里面封装了source源到destination目标的过程
*/
class VoltageAdapter implements Voltage5V{
private Voltage220V voltage220V;
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public double getVoltage() {
return voltage220V.getVoltage() / 40;
}
}
public class Phone {
// 充电
public void charge(Voltage5V voltage5V){
double voltage = voltage5V.getVoltage();
System.out.println("最终手机充电所用电压:" + voltage + "V");
}
}
public class Client {
public static void main(String[] args) {
Phone phone = new Phone();
// 已知有一个220V的电源,要用它给手机进行充电,我们只能将220V的电源进行处理后才能给手机充上电
// VoltageAdapter适配器对Voltage220V这个不能直接使用的电源适配后就可以使用了
phone.charge(new VoltageAdapter(new Voltage220V()));
}
}
3.桥接模式 Bridge:桥接
1.定义:将抽象部分与实现部分分离,使它们都可以独立的变化。
主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
2.优点
1、抽象和实现的分离。
2、优秀的扩展能力。
对于两个独立变化的维度,使用桥接模式再适合不过了。
缺点
桥接模式的引入会增加系统的理解与设计难度
上图是常见的需求设计方案,非常不便于维护,手机的型号与品牌耦合度太高,当要新增滑盖(Slide)式的手机时,对应的品牌手机也要新增;
桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本
使用桥接模式,对该项目进行设计,型号或品牌的扩展,都不会影响另一方;