作者:某人_Valar
如需转载请保留原文链接;
设计模式的3大类:
- 创建型模式(5种)建造者模式,单例模式,工厂方法模式,抽象工厂模式,原型模式。
- 结构性模式(7种)适配器模式,装饰模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
- 行为型模式(11种)策略模式,模板方法模式,观察者模式,迭代器模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,中介者模式,解释器模式。
1. 什么是装饰模式
结构型设计模式的一种,其可以在不必改变类文件和不使用继承的情况下,给一个现有的对象添加新的功能,是继承的替代方案之一。
一般在装饰模式中有下面几个角色:
- Component:抽象组件。
- ConcreteComponent:组件具体实现类。
- Decorator:抽象装饰者,从外类来扩展Component类的功能。
- ConcreteDecorator:装饰者的具体实现类。
2. 装饰模式的实现
以武侠修炼为例:杨过本身就会全真剑法,另有洪七公和欧阳锋分别向杨过传授过打狗棒法和蛤蟆功,这样杨过除了会全真剑法,还会打狗棒和蛤蟆功。洪七公和欧阳锋就起到了“装饰”杨过的作用。(例子改编自《Android进阶之光》)
(1)抽象组件
一个武侠的抽象类
/**
* 武侠本身都有使用武功的方法
*/
public abstract class Swordman {
public abstract void attackMagic();
}
(2)组件具体实现类
被装饰的具体对象,这里就是杨过。
public class YangGuo extends Swordman{
@Override
public void attackMagic() {
//杨过初始的武学是全真剑法
System.out.println("杨过使用全真剑法");
}
}
(3)抽象装饰者
抽象装饰者继承自抽象组件,并保持了一个对于抽象组件的引用。在这里可以理解为:杨过的师父们(装饰者)本身也是武侠,所以继承自武侠。
public abstract class Master extends Swordman{
private Swordman swordman;
public Master(Swordman swordman){
this.swordman = swordman;
}
@Override
public void attackMagic(){
swordman.attackMagic();
}
}
(4)装饰者的具体实现类
杨过的两个师父,洪七公和欧阳锋
public class HongQiGong extends Master{
public HongQiGong(Swordman swordman) {
super(swordman);
}
//洪七公教授打狗棒法
public void teachAttackMagic(){
System.out.println("杨过使用打狗棒法");
}
@Override
public void attackMagic() {
super.attackMagic();
teachAttackMagic();
}
}
public class OuYangFeng extends Master{
public OuYangFeng(Swordman swordman) {
super(swordman);
}
//欧阳锋教授蛤蟆功
public void teachAttackMagic(){
System.out.println("杨过使用蛤蟆功");
}
@Override
public void attackMagic() {
super.attackMagic();
teachAttackMagic();
}
}
(5)测试类
public class Test {
public static void main(String[] args){
//创建一个武侠--杨过
Swordman yangGuo = new YangGuo();
//洪七公向杨过传授打狗棒法
yangGuo = new HongQiGong(yangGuo);
//杨过出招
yangGuo.attackMagic();
System.out.println("一个月后..........");
//欧阳锋向杨过传授蛤蟆功
yangGuo = new OuYangFeng(yangGuo);
//杨过再出招
yangGuo.attackMagic();
}
}
运行结果:
3. 装饰模式优缺点
优点:
- 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
缺点:
- 多层装饰比较复杂。
另外:
Java I/O接口的设计就使用了装饰者模式
InputStream为抽象组件;
FileInputStream,StringBufferInputStream,ByteArrayInputStream是一些具体组件;
FilterInputStream是一个抽象装饰者;
PushbackInputStream,BufferedInputStream,DataInputStream,LineNumberInputStream是具体装饰者。
参考:
《Head First设计模式》
《Android进阶之光》
装饰器模式-菜鸟教程