从这一专栏开始将学习设计模式,上课学习和自己总结归纳的笔记将总结出来供大家参考。
参考书籍:《设计模式就该这样学》
其他文章:
Java设计模式-UML类图 | Java设计模式-七大架构设计原则-开闭原则 |
---|---|
Java设计模式-七大架构设计原则-依赖倒置原则 | Java设计模式-七大架构设计原则-单一职责原则 |
Java设计模式-七大架构设计原则-接口隔离原则 | Java设计模式-七大架构设计原则-最少知道原则(迪米特法则) |
Java设计模式-七大架构设计原则-里氏替换原则和合成复用原则 | Java设计模式-创建型设计模式-简单工厂模式 |
Java设计模式-创建型设计模式-工厂方法模式(工厂模式) | Java设计模式-创建型设计模式-抽象工厂模式 |
Java设计模式-创建型设计模式-建造者模式 | Java设计模式-创建型设计模式-原型模式 |
Java设计模式-创建型设计模式-单例模式 | Java设计模式-结构型设计模式-适配器模式 |
Java设计模式-行为型设计模式-观察者模式 | |
在GOF23种设计模式中,有三种类型的设计模式,分别是:创建型设计模式、结构型设计模式、行为型设计模式。
结构型设计模式有:代理模式、 适配器模式 、桥接模式、装饰模式、外观模式、享元模式、组合模式 7 种结构型模式。
类结构型模式:关心类的组合,由多个类组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系。
对象结构型模式:关心类与对象的组合,通过关联关系,在一个类中定义另外一个类的实例对象,然后通过该对象调用相应的方法。
适配器模式(Adapter Pattern): 是作为两个不兼容的接口之间的桥梁,将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
在GoF23种设计模式中属于结构型设计模式:
其中包括:代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式 7 种结构型模式。
Client:用户类,使用目标接口,与和目标接口一致的对象合作。
Target:新的接口类,定义一个客户端使用的特定接口。
Adaptee:原有的类,即需要适配的类一个现存需要适配的接口。
Adapter:适配器类,负责将Adaptee的接口转换为Target的接口。适配器是一个具体的类,这是该模式的核心。
优点
可以让任何两个没有关联的类一起运行;
增加了类的透明性;
提高了类的复用度;
灵活性非常好。
缺点
过多使用适配器会使系统非常凌乱;
由于java是单继承的,所以只能适配一个适配器类,而且目标类必须是抽象的;
只有碰到无法改变原有设计和代码的情况下,才会考虑适配器模式。
类适配器:
对象适配器:
案例:
某公司要开发一款儿童玩具汽车,为了更好地吸引小朋友的注意力,该玩具汽车在移动过程中伴随着灯光闪烁和声音提示。在该公司以往的产品中已经实现了控制灯光闪烁(例如警灯闪烁)和声音提示(例如警笛音效)的程序,为了重用先前的代码并且使汽车控制软件具有更好的灵活性和扩展性,现使用适配器模式设计该玩具汽车控制软件。
Target:CarController
Adaptee:PoliceSound、PoliceLamp
Adapter:PoliceCarAdapter
类图如下:
具体代码实现:
1.CarController类,充当Target
/**
汽车控制类,充当目标抽象类
*/
public abstract class CarController{
public void move(){
System.out.println("玩具汽车移动!");
}
public abstract void phonate();//发出声音
public abstract void twinkle();//灯光闪烁
}
2.PoliceLamp,PoliceSound类,充当Adaptee
/**
警灯类,充当适配者
*/
public class PoliceLamp{
public void alarmLamp(){
System.out.println("呈现警车警灯闪烁!");
}
}
/**
警笛类,充当适配者
*/
public class PoliceSound{
public void alarmSound(){
System.out.println("发出警车警笛声音!");
}
}
3.PoliceCarAdapter类,充当Adapter
/**
警车适配器,充当适配器。
*/
public class PoliceCarAdapter extends CarController{
private PoliceSound sound;//定义适配者PoliceSound对象
private PoliceLamp lamp;//定义适配者PoliceLamp对象
public PoliceCarAdapter(){
sound = new PoliceSound();
lamp = new PoliceLamp();
}
//发出警笛声音
public void phonate(){
sound.alarmSound();//调用适配者类PoliceSound的方法
}
//呈现警灯闪烁
public void twinkle(){
lamp.alarmLamp();//调用适配者类PoliceLamp的方法
}
}
4.Client(客户端测试类)
*/
public class Client {
public static void main(String[] args) {
CarController carController=new PoliceCarAdapter();
carController.move();
carController.phonate();
carController.twinkle();
}
}