读《大话设计模式》学习小结(一)装饰器模式

前言,作为个人总结设计模式学习的第一篇文章,我们先说点别的。设计模式在早以前我就有在看,并且部分模式也做了对应的总结。故前三、四篇的内容将是我之前做的总结,现在放到博客上。或许是因为看《大话设计模式》而做总结的原因,自身也受其影响,在总结中也会带有些生活的元素。此外,我还会配上自己写的实例代码,以方便理解。有心的读者希望也能多写写代码,设计模式,只有到你遇到相应的问题及环境时才会觉得它的好处。

此文及同系列设计模式小结文章面向的读者:该领域的萌新。因为,此处的小结是学习小结,一个比较概述的个人理解。用我的方式让你了解它,所以可能也未及全面。有深入探究兴趣的伙伴请直接读原书籍《大话设计模式》。

小小的感言,《大话设计模式》一书我是读完了的,当然后半部分看得比较快。这第一遍看完后我并没有感觉自己学会了如何使用多少设计模式。我学到的更多的是有这么些设计模式,它们可以用于什么场景。还有我认为更重要的,蕴含在设计模式中的核心(我认为的核心):抽象思维、减少重复代码的思维。然后的话,目前我仅对我认识比较深及平时接触多的设计模式作总结,也就是不会把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();
    }
}


输出:

加辣的芝士鸡腿汉堡来了
芝士汉堡来了



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值