大话设计模式的学习(三)--装饰模式

1、装饰模式;

指动态的给对象添加一些额外得职责,就增加功能来说,装饰模式比生成子类更加灵活。

abstract class Component {
    
    public  abstract void Operation();
    
}


class ConcreteComponent extends Component {

	@Override
	public void Operation() {
		System.out.println("具体对象的操作");
		
	}

}

abstract class Decorator  extends Component{
	protected  Component component;
	public void SetComponent(Component component){
		this.component = component;
	}	
	@Override
	public void Operation(){
		if(component!=null){
			System.out.println(component.getClass().getName());
			component.Operation();
		}
	}
}


public class ConcreteDecoratorA extends Decorator {
	//本类独有的功能,以区别ConcreteDecoratorB
	private String addedState;
	@Override
	public void Operation(){
		super.Operation();
		addedState= "New state";
		System.out.println("具体装饰对象A的操作");
	}
}


public class ConcreteDecoratorB extends Decorator {
	//本类独有方法,以区别ConcreteDecoratorA
	private void  addedBehavior(){
		
	}	
	@Override
	public void Operation(){
		super.Operation();
		addedBehavior();
		System.out.println("具体装饰对象B的操作");
	}	
}

客户端调用代码:
ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA a = new ConcreteDecoratorA();
ConcreteDecoratorB b = new ConcreteDecoratorB();
a.SetComponent(c);
b.SetComponent(a);
b.Operation();

控制台打印结果:
decorator.ConcreteDecoratorA
decorator.ConcreteComponent
具体对象的操作
具体装饰对象A的操作
具体装饰对象B的操作

装饰对象是通过SetComponent来对对象进行包装的,这样每个装饰对象的实现就和如何使用这个对象分开了,每个装饰对象只需要关注自己的功能,不需要关心如何被添加到对象链当中。

public class Person {
	public Person(){}	
	private String name;
	public Person(String name){
		this.name = name;
	}
	public void  Show(){
		System.out.println("装扮的"+name);
	}

}

//服饰类  继承Person
public class Finery extends Person {
	protected Person person;
	//打扮方法
	public void Decorate(Person person){
		this.person = person;
	}
	@Override
	public void  Show(){
		if(person!= null){
			person.Show();
		}
	}
}

//具体的服饰类  T短袖  继承服饰类
public class Tshirts extends Finery{
	@Override
	public void Show(){
		super.Show();
		System.out.println("穿短袖啦!");
	}
}

//具体的服饰类  短裤、裤子  继承服饰类
public class BigTrouser extends Finery{
	@Override
	public void Show(){
		super.Show();
		System.out.println("穿短裤啦!");
	}
}


public class StartMain {
	public static void main(String[] args) {
		Person person = new Person("小明");		
		BigTrouser bt = new BigTrouser();
		Tshirts ts= new Tshirts();		
		bt.Decorate(person);
		ts.Decorate(bt);
		ts.Show();		
		//  装扮的小明	  穿短裤啦    穿短袖啦 		
	}
}

 

总结:装饰模式是为已有功能动态的添加更多功能的一种方式。

在起初的设计中,当系统需要新功能的时候,是向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为,在新类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。 

而装饰模式却起了一个非常好的解决办法,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为的时候,客户代码就可以在运行时根据需要有选择的、按顺序的使用装饰功能包装对象了。

装饰模式的优点:

把类中的装饰功能从类中搬移出去,这样可以简化原有类。有效的把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值