Decorator pattern
May 15, 2019 · View on GitHub
装饰器设计模式,23种设计模式之一
想要理解这个设计模式,可参照 wikipedia 的解释
下面只是自己的理解,
解决的问题
- 可以动态(运行时)的修改类的职责
- 可以灵活的替代子类继承的一种设计模式
装饰器模式的优点就是在运行时,动态的包装类,增强类的功能,而继承则做不到。
demo
/**
* desc: 一个牛逼的 枪,基于 装饰器模式
* <p>
*
* @author web1992
* <p>
*/
public class DecoratorPatternDemo {
public static void main(String[] args) {
Gun customerGun = new CustomerGun();
customerGun = new AKGun(customerGun);
customerGun = new M4Gun(customerGun);
customerGun = new GatlinGun(customerGun);
customerGun.fire();
System.out.println("--------------------------");
// 动态性,换个顺序
// 去掉 GatlinGun
Gun customerGun1 = new CustomerGun();
customerGun1 = new M4Gun(customerGun1);
customerGun1 = new AKGun(customerGun1);
customerGun1.fire();
}
}
/**
* 枪接口
*/
interface Gun {
void fire();
}
abstract class AbstractGun implements Gun {
@Override
public void fire() {
System.out.println("AbstractGun# prepare fire ...");
}
}
class AKGun implements Gun {
private Gun gun;
public AKGun(Gun gun) {
this.gun = gun;
}
@Override
public void fire() {
gun.fire();
System.out.println("AKGun# ta ta tu tu ...");
}
}
class M4Gun implements Gun {
private Gun gun;
public M4Gun(Gun gun) {
this.gun = gun;
}
@Override
public void fire() {
gun.fire();
System.out.println("M4Gun# ta ta tu tu ...");
}
}
class GatlinGun extends AbstractGun implements Gun {
private Gun gun;
public GatlinGun(Gun gun) {
this.gun = gun;
}
@Override
public void fire() {
super.fire();
gun.fire();
System.out.println("GatlinGun# ta ta tu tu tu ...");
}
}
class CustomerGun implements Gun {
@Override
public void fire() {
System.out.println("CustomerGun# ta ta ta ta ...");
}
}