设计模式:装饰模式(Decorator)

装饰模式,从装饰两个字可以联想到我们身上的首饰啊衣服什么的。因此本文就以穿衣服为例子说说装饰模式。


该例子的难点是用程序把所需要的衣服按照正确的顺序串联起来控制。


先简单说说装饰模式:装饰模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。


按照笔者的理解,装饰模式就是将多个继承了同一个父类的对象嵌套起来。然后调用的时候按照嵌套的顺序一个个地调用这些对象的方法。~

好吧也许看完这句话还不是很了解,没关系直接上代码~~看完代码说不定就懂了呢~~


既然本例是以穿衣服为例,那么就需要一个人。我们先写一个人(Person)类,然后有一个展示衣服的方法show(),人一般都有个名字,给他个name变量,于是人这个类就如下所示:

public  class Person {
	private String name;
	public Person(){}
public Person(String name){
	this.name=name;
}

public void show(){
	System.out.println(name+"穿衣服");
}
}

然后需要一个衣服类:

public class Finery extends Person {

	protected Person component;
	
	public void Decorate(Person p){
		component=p;
	}

	@Override
	public void show() {
		if(component!=null){
			component.show();
		}
	}
	
	 
}

可以看到有一个Decorate的方法,这个方法就是在设置一层一层嵌套的时候使用的。


接下来写几个具体衣服的类:Tshirts,裤子,拖鞋(不好意思,没内裤~~)


Tshirts:

public class TShirts extends Finery{

	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("Tshirt");
		super.show();
	}

}

裤子:

public class BigTrouser extends Finery{

	@Override
	public void show() {
System.out.println("大垮裤");
		super.show();
	}

	
}

拖鞋:

public class Slippers extends Finery{

	@Override
	public void show() {
		System.out.println("拖鞋");
		super.show();
	}

}

最后在main方法组装:


public class Main {

	public static void main(String[] args) {
		Person p=new Person("小明");
		System.out.println("准备衣服....");
		TShirts ts=new TShirts();
		BigTrouser bt=new BigTrouser();
		Slippers s=new Slippers();
		ts.Decorate(p);
		bt.Decorate(ts);
		s.Decorate(bt);
		s.show();
		

	}

}

运行结果:

准备衣服....

拖鞋

大垮裤

Tshirt

小明在穿衣服


好吧万年不变的小明,不要在意这些细节。我们看看上面的代码,是不是真的是多个继承了同一个父类(Person)的对象互相嵌套,然后第一个对象的方法,调用第二个对象的方法,然后第二个对象又会继续调用第三个对象。。。如此类推像是一条链一样。


上面的例子的装饰模式是利用Decorate方法来对对象进行包装的。这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。


装饰模式通常用于:为已有的功能动态地添加更多功能的一种方式。当系统需要新的功能时,将新的功能的类包装旧的类,而无需修改原先的代码。当需要的时候,也可以根据需要有选择地使用装饰功能包装对象了。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值