装饰者模式:装饰者模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
使用步骤:让装饰者类与原始类实现同样接口或继承同样类,原始类作为构造方法的参数传给装饰者类,装饰都可以重写原始类的方法或添加方法或属性使装饰都类拥有原始类的方法,同时功能更强大。
在这个模式中主要有四大组件
1.原始类接口(接口类型或者抽象类)
2.原始类的具体实现类
3.装饰器接口(一般类或抽象类)
4.继承了装饰器接口的一系列具体装饰器
//原始接口:饼 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 DecoratorPhone implements Cake { protected Cake cake; public DecoratorPhone(Cake cake) { this.cake = cake; } @Override public String descripestion() { return cake.descripestion(); } @Override public Double money() { return cake.money(); } }
//具体装饰器(鸡蛋手抓住饼),重写装饰器基类方法 public class EggHandCake extends DecoratorPhone{ 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 DecoratorPhone{ public HamEggHandCake(Cake cake){ //this.phone = phone; 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()); } }
测试结果:
原文:https://www.cnblogs.com/wakey/p/10463563.html