装饰模式

在面向对象中,装饰模式的核心其实就是对类的封装。比较正规的说法就是:可以动态地扩展类的功能。

该模式中使用其他类(构建角色)对基本类(被装饰角色)进行封装的目的就是避免在不修改基本类的代码和不对基本类进行继承的情况下对基本类的功能的扩展。

(注:给定一个基本类,要对该类增加方法,无外乎就几种方法,一个是直接修改类的代码,第二个写一个子类对这个基本类继承,再在子类中增加想要的方法,第三个就是写一个新的类对这个基本类进行封装。)

为了不让这两个类(构建角色和被装饰角色)解耦,利用面向接口编程,使用统一的接口。


代码

接口Component

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

将要被扩展的类ConcreteComponent

public class ConcreteComponent implements Component{

	@Override
	public void Operation() {
		// TODO Auto-generated method stub
		System.out.println("执行具体对象");
	}
}

装饰的基本类

public class Decorator implements Component{
	
	private Component m;
	
	public void SetComponent(Component m){
		this.m=m;
	}
	
	@Override
	public void Operation() {
		// TODO Auto-generated method stub
		if(m!=null){
			m.Operation();
		}
	}
}

用于装饰的类A

public class ConcreteDecoratorA  extends Decorator{
	private String  addedStateString;
	public void Operation(){
		super.Operation();
		addedStateString="进行了状态属性的装饰";
		System.out.println(addedStateString);
	}
}

用于装饰的类B

public class ConcreteDecoratorB extends Decorator {
	public void Operation(){
		super.Operation();
		b();
	}
	private void b(){
		System.out.println("进行了操作行为装饰");
	}
}



最后控制台使用

public class main {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Component c_cComponent=(Component) new ConcreteComponent();
		ConcreteDecoratorA c_cdA=new ConcreteDecoratorA();
		ConcreteDecoratorB c_cdB=new ConcreteDecoratorB();
		c_cdA.SetComponent(c_cComponent);
		c_cdB.SetComponent(c_cdA);
		c_cdB.Operation();
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值