装饰者模式:装饰者模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
使用步骤:让装饰者类与原始类实现同样接口或继承同样类,原始类作为构造方法的参数传给装饰者类,装饰都可以重写原始类的方法或添加方法或属性使装饰都类拥有原始类的方法,同时功能更强大。
参与者:
1.Component(被装饰对象的基类): 定义一个对象接口,可以给这些对象动态地添加职责。
2.ConcreteComponent(具体被装饰对象): 定义一个对象,可以给这个对象添加一些职责。
3.Decorator(装饰者抽象类): 维持一个指向Component实例的引用,并定义一个与Component接口一致的接口。
4.ConcreteDecorator(具体装饰者):具体的装饰对象,给内部持有的具体被装饰对象,增加具体的职责。
//原始接口:饼 public interface Cake { public String descripestion(); public Double money(); }
//具体实现类:手抓饼 public class HandCake implements Cake { @Override public String descripestion() { return "手抓饼"; } @Override public Double money() { return 2.5; } }
//装饰器基类 public class DecoratorCake implements Cake { protected Cake cake; public DecoratorCake(Cake cake) { this.cake = cake; } @Override public String descripestion() { return cake.descripestion(); } @Override public Double money() { return cake.money(); } }
//具体装饰器(鸡蛋手抓住饼),重写装饰器基类方法 public class EggHandCake extends DecoratorCake{ public EggHandCake(Cake cake){ super(cake); } @Override public String descripestion() { return "鸡蛋"+cake.descripestion(); } @Override public Double money() { return 2+cake.money(); } }
//具体装饰器(火腿手抓住饼),重写装饰器基类方法 public class HamEggHandCake extends DecoratorCake{ public HamEggHandCake(Cake cake){ super(cake); } @Override public String descripestion() { return "火腿"+cake.descripestion(); } @Override public Double money() { return 3+cake.money(); } }
//测试类 public class MyTest { @Test public void test() { Cake c1 = new HandCake(); System.out.print(c1.descripestion()); System.out.println(" 价格:"+c1.money()); //测试单个修饰 EggHandCake c2 =new EggHandCake(c1); System.out.print(c2.descripestion()); System.out.println(" 价格:"+c2.money()); //测试多重修饰 HamEggHandCake c3 =new HamEggHandCake(c2); System.out.print(c3.descripestion()); System.out.println(" 价格:"+c3.money()); } }
测试结果: