特色:html
/** * 组件类接口 */ public interface IComponent { void operation(); } /** * 具体组件类的具体业务逻辑实现 */ public class Component implements IComponent { @Override public void operation() { System.out.println("component operation!"); } } /** * 装饰器的抽象类 */ public abstract class ADecorator implements IComponent { /** * 关键在于这个组合组件接口对象 */ private IComponent component; public ADecorator(IComponent component) { this.component = component; } @Override public void operation () { component.operation(); } } /** * 装饰器具体实现1 */ public class Decorator1 extends ADecorator { public Decorator1(IComponent component) { super(component); } @Override public void operation() { super.operation(); System.out.println("decorator1"); } } /** * 装饰器具体实现2 */ public class Decorator2 extends ADecorator { public Decorator2(IComponent component) { super(component); } @Override public void operation() { super.operation(); System.out.println("decorator2"); } }
/** * 应用与测试类 */ public class Test { public static void main(String[] args) { //应用类 IComponent component; //初始化 component = new Component(); //装饰 component = new Decorator1(component); component = new Decorator2(component); //具体方法的调用 component.operation(); } }
component operation! decorator1 decorator2
装饰着模式中的各组件:java
咱们买煎饼果子能够选择加香肠,仍是加鸡蛋。煎饼果子就是咱们的组件类,而加鸡蛋加培根则是装饰者的具体实现类.
/** * 煎饼的抽象类,也就是组建类 */ public abstract class ABattercake { /** * 最后的描述 * @return */ protected abstract String getDesc (); /** * 总共的价格 * @return */ protected abstract int cost (); } /** * 煎饼的具体实现 */ public class Battercake extends ABattercake { @Override protected String getDesc() { return "煎饼"; } @Override protected int cost() { return 8; } } /** * 装饰着的抽象类 */ public abstract class AbstractDecorator extends ABattercake { //组合的煎饼对象 private ABattercake aBattercake; public AbstractDecorator(ABattercake aBattercake) { this.aBattercake = aBattercake; } protected abstract void doSomething(); @Override protected String getDesc() { return aBattercake.getDesc(); } @Override protected int cost() { return aBattercake.cost(); } } /** * 装饰者的具体实现 */ public class EggDecorator extends AbstractDecorator { public EggDecorator(ABattercake aBattercake) { super(aBattercake); } @Override protected void doSomething() { } @Override protected String getDesc() { return super.getDesc() + " 加一个鸡蛋"; } @Override protected int cost() { return super.cost() + 1; } } /** * 装饰者的具体实现 */ public class SausageDecorator extends AbstractDecorator { public SausageDecorator(ABattercake aBattercake) { super(aBattercake); } @Override protected void doSomething() { } @Override protected String getDesc() { return super.getDesc() + " 加一根香肠"; } @Override protected int cost() { return super.cost() + 2; } }
public class Test { public static void main(String[] args) { ABattercake aBattercake; aBattercake = new Battercake(); aBattercake = new EggDecorator(aBattercake); aBattercake = new EggDecorator(aBattercake); aBattercake = new SausageDecorator(aBattercake); System.out.println(aBattercake.getDesc() + "销售价格:" + aBattercake.cost()); } }
煎饼 加一个鸡蛋 加一个鸡蛋 加一根香肠销售价格:12
装饰者模式和代理模式git
装饰着模式和适配器模式github
设计模式之装饰着模式
: https://github.com/sigmako/design-pattern/tree/master/decorator编程
慕课网设计模式精讲
: https://coding.imooc.com/class/270.html 《JAVA与模式》之装饰模式
: https://www.cnblogs.com/java-my-life/archive/2012/04/20/2455726.html