装饰模式


       装饰模式

              说明:本人第一次在javaeye上发表文章,不足之处还请各位大侠多多指点

在评论上多多评价,以后好改进,谢谢! 



一、模式提出的背景:

      动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活,需要把所需的功能按正确的顺序串联起来进行控制。

二、代码的业务背景:

         一个人需要穿夸库,西装,戴帽子,鞋子等如何动态并客户制定穿着顺序?

本次业务说明,一个人如何装扮篮球鞋、大夸裤、T恤,并且是按照一种什么样的顺序装扮。

三、UML类图: 

四、代码解说

package decorator.hewen.wen;

public class Person {
	protected String name;//装饰人的姓名
	public Person(String name ){
		this.name=name;
	}
	public void show(){
		System.out.println("这个装扮的对象:"+name);
	}
}

第二个文件:

package decorator.hewen.wen;

public class DecoratorAction extends Person {
	
	private Person perAction;
	public DecoratorAction(String name) {
		super(name);
	}
	public void setSequence(Person perAction){//这个是设置装扮的顺序
		this.perAction=perAction;
	}
	public void show(){
		if(perAction!=null){
		perAction.show();
	}
		
	}
}

 第三个文件:

package decorator.hewen.wen;

public class BaseballShoes extends DecoratorAction {
	public BaseballShoes(){
		super("何文");
	}
	public void show(){
		System.out.println("篮球鞋");
		super.show();//调用父类的show方法
	}
	
}

 第四个文件:

package decorator.hewen.wen;

public class BigTrouser extends DecoratorAction {

	public BigTrouser() {
		super("何文");
	}
	public void show(){
		System.out.println("花夸裤");
		super.show();
	}
}

 第五个文件:

package decorator.hewen.wen;

public class TShirts extends DecoratorAction {

	public TShirts() {
		super("何文");

	}
	public void show(){
		System.out.println("大T恤");
		super.show();
	}
}

 第六个测试文件:

package decorator.hewen.wen;
/**
 * 
 * @author Administrator
 * 用户不用关心中间装饰类,此模式是为了已有功能
 *	动态地添加更多功能的一种方式。
 *  在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,
 *  而这些新加入的东西仅仅是为了满足一些只在特殊情况下才会执行的特殊行
 *  为的需要,而此模式确提供了一个非常解决方案,在中间添加一个装饰类,
 *  只需要用户继承该装饰此类,然后动态的添加相应的功能需求。
 *  因此当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、有顺序地使用
 *  装饰功能包装的类。
 *  有效的把类的核心职责和装饰功能区分开来了,而且可以去除相关类中的重复逻辑功能。
 */
public class TestClass {
public static void main(String[] args){
	Person per=new Person("何文");//建立装扮的对象
	
	System.out.println("第一种装扮方式:  ");
	//先创建装扮的功能对象
	BaseballShoes baseShoes=new BaseballShoes();
	BigTrouser bigTrouser=new BigTrouser();
	TShirts ts=new TShirts();
	/**
	 * 按照执行的顺序执行装扮的对象
	 */
	ts.setSequence(per);
	bigTrouser.setSequence(ts);
	baseShoes.setSequence(bigTrouser);
	baseShoes.show();System.out.println();
               System.out.println("第二种装扮方式:  ");//这个是第二种装扮的顺序
               bigTrouser.setSequence(per);
               baseShoes.setSequence(bigTrouser);
               ts.setSequence(baseShoes);
               ts.show();
}
}

 运行的结果:

第一种装扮方式:  
篮球鞋
花夸裤
大T恤
这个装扮的对象:何文

第二种装扮方式:  
大T恤
篮球鞋
花夸裤
这个装扮的对象:何文

 

              

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值