装饰模式(Decorator)
一、装饰模式的类图如下
在装饰模式中的角色有:
● 抽象构件(Component)角色:就是需要装饰者的基类
● 具体构件(ConcreteComponent)角色:具体需要装饰的实例类
● 装饰(Decorator)角色:装饰物/装饰物 的基类
● 具体装饰(ConcreteDecorator)角色:具体装饰物类
话不多说,先看实例:
二、装饰模式具体实例
待装饰类的基类:
/** * 人 */ public interface People { public void speak(); }
具体待装饰类 ,中国人一出生就说汉语, 在人生旅途中也需要学习多种语言来装饰自己
/** * * 中国人类 实现people * 重写speak()方法 , 中国人说汉语 */ public class Chinese implements People { @Override public void speak() { System.out.println("中国娃说汉语"); } }
装饰物/装饰品 的基类 --此处装饰类 为语言
/** * 装饰类 * 语言基类 */ public class Language implements People { private People people; public Language() { } public Language(People people) { this.people = people; } @Override public void speak() { people.speak(); } }
具体装饰类1: 装饰自我 - - 学习英语
/** * 具体装饰类1 * 学习说英语 */ public class English extends Language{ public English(People people) { super(people); people.speak(); } @Override public void speak() { System.out.println("学会说英语"); } }
具体装饰类2 装饰自我 - - 学习法语
/** * 具体装饰类2 * 学习说法语 */ public class French extends Language{ public French(People people) { super(people); people.speak(); } @Override public void speak() { System.out.println("学会说法语"); } }
具体装饰类3 装饰自我 - - 学习德语
** * 具体装饰类 * 学习说德语 */ public class German extends Language{ public German(People people) { super(people); people.speak(); } @Override public void speak() { System.out.println("学会说德语"); } }
测试类:
public class main { public static void main(String[] args) { People people = new Chinese(); /* People people1 = new English(people); People people2 = new French(people1); people2.speak();*/ People zhangsan = new English(new French(new German(people))); zhangsan.speak(); } }
输出结果: