前言,作为个人总结设计模式学习的第一篇文章,我们先说点别的。设计模式在早以前我就有在看,并且部分模式也做了对应的总结。故前三、四篇的内容将是我之前做的总结,现在放到博客上。或许是因为看《大话设计模式》而做总结的原因,自身也受其影响,在总结中也会带有些生活的元素。此外,我还会配上自己写的实例代码,以方便理解。有心的读者希望也能多写写代码,设计模式,只有到你遇到相应的问题及环境时才会觉得它的好处。
此文及同系列设计模式小结文章面向的读者:该领域的萌新。因为,此处的小结是学习小结,一个比较概述的个人理解。用我的方式让你了解它,所以可能也未及全面。有深入探究兴趣的伙伴请直接读原书籍《大话设计模式》。
小小的感言,《大话设计模式》一书我是读完了的,当然后半部分看得比较快。这第一遍看完后我并没有感觉自己学会了如何使用多少设计模式。我学到的更多的是有这么些设计模式,它们可以用于什么场景。还有我认为更重要的,蕴含在设计模式中的核心(我认为的核心):抽象思维、减少重复代码的思维。然后的话,目前我仅对我认识比较深及平时接触多的设计模式作总结,也就是不会把20多个设计模式都立马都写一遍。而且感觉自己写的代码还不够多,没遇到对应的场景,就没有相应的体会。有想法的设计模式再写进博客吧。
废话扯了一大车,正文开始。
装饰器模式:抽象核心职责,使用继承,通过子类对父类方法的“装饰”(方法重写,保留父类行为并增加其他装饰功能),动态地为父类添加其他职责、行为。
还是课堂上那个熟悉的“汉堡”:
public abstract class Component {//抽象的汉堡
abstract void operation();
}
public class ConcreteComponent extends Component{//具体的汉堡
@Override
void operation() {
System.out.println("汉堡来了");
}
}
public abstract class Decorator extends Component{//抽象的装饰器
protected Component component = null;
public void decorator(Component component){//装饰方法
this.component = component;
}
@Override
void operation() {
if(component != null){
component.operation();
}
}
}
public class ConcreteDecoratorA extends Decorator{//具体的装饰器A,负责加鸡腿
@Override
void operation() {
addDrumstick();//加鸡腿
super.operation();
}
void addDrumstick(){
System.out.print("鸡腿");
}
}
public class ConcreteDecoratorB extends Decorator{//具体的装饰器B,负责加芝士
@Override
void operation() {
addCheese();//加芝士
super.operation();
}
void addCheese(){
System.out.print("芝士");
}
}
public class ConcreteDecoratorC extends Decorator{//具体的装饰器C,负责加点其他的
private String chili = null;
public void setChili(String chili){
this.chili = chili;
}
@Override
void operation() {
System.out.print(chili);//加点其他的
super.operation();
}
}
public class Client {
public static void main(String[] args){
//开店准备,备好鸡腿、芝士、辣椒酱
ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA();
ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB();
ConcreteDecoratorC concreteDecoratorC = new ConcreteDecoratorC();
//开门迎客,服务员:欢迎来到汉堡店,您需要点什么?
//客人:
//给我来一个汉堡
ConcreteComponent hbgA = new ConcreteComponent();
//要有鸡腿
concreteDecoratorA.decorator(hbgA);
//要有芝士
concreteDecoratorB.decorator(concreteDecoratorA);
//放点辣椒酱
concreteDecoratorC.setChili("加辣的");
concreteDecoratorC.decorator(concreteDecoratorB);
//服务员:您点的第一个汉堡
concreteDecoratorC.operation();
//客人:
//一个不够,再来一个
ConcreteComponent hbgB = new ConcreteComponent();
//这个简单点就好,有芝士就行
concreteDecoratorB.decorator(hbgB);
//服务员:您点的第二个汉堡
concreteDecoratorB.operation();
}
}
加辣的芝士鸡腿汉堡来了
芝士汉堡来了