昨天面试Java后端被问到代理模式、装饰模式,其中装饰模式,记得是子类不断装饰(添加功能),但具体结构忘记了- -!
ps:遇到的面试官还好,这个模式没答上没有深究。
回家赶紧翻大话设计模式查阅。
定义
装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。
类图
实现要点
-
定义基础装饰类,包含被装饰类属性、设置属性的装饰方法、定义功能方法调用被装饰类的功能方法
-
具体各装饰类,继承自基础装饰类,重写功能方法,调用父类的方法和添加特有的功能
Java示例
/**
* @author cdfive
* @date 2019-04-01
*/
public class DecoratorDemo {
private static class Person {
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public void show() {
System.out.println(String.format("装扮的%s", name));
}
}
private static class Finery extends Person {
protected Person person;
public void decorate(Person person) {
this.person = person;
}
@Override
public void show() {
if (person != null) {
person.show();
}
}
}
private static class TShirts extends Finery {
@Override
public void show() {
System.out.print("大T恤 ");
super.show();
}
}
private static class TXue extends Finery {
@Override
public void show() {
System.out.print("大T恤 ");
super.show();
}
}
private static class Xizhuang extends Finery {
@Override
public void show() {
System.out.print("西装 ");
super.show();
}
}
private static class NiuZai extends Finery {
@Override
public void show() {
System.out.print("牛仔 ");
super.show();
}
}
private static class LingDai extends Finery {
@Override
public void show() {
System.out.print("领带 ");
super.show();
}
}
private static class QiuXie extends Finery {
@Override
public void show() {
System.out.print("球鞋 ");
super.show();
}
}
private static class PiXie extends Finery {
@Override
public void show() {
System.out.print("皮鞋 ");
super.show();
}
}
public static void main(String[] args) {
Person person = new Person("张三");
System.out.println("-----第一种装扮-----");
TXue tXue = new TXue();
NiuZai niuZai = new NiuZai();
QiuXie qiuXie = new QiuXie();
tXue.decorate(person);
niuZai.decorate(tXue);
qiuXie.decorate(niuZai);
qiuXie.show();
System.out.println("-----第二种装扮-----");
Xizhuang xizhuang = new Xizhuang();
LingDai lingDai = new LingDai();
PiXie piXie = new PiXie();
xizhuang.decorate(person);
lingDai.decorate(xizhuang);
piXie.decorate(lingDai);
piXie.show();
System.out.println("-----第三种装扮-----");
piXie.decorate(person);
niuZai.decorate(piXie);
tXue.decorate(niuZai);
tXue.show();
}
}