装饰器模式

1、初识装饰器模式

  装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。其结构图如下:

 

  • Component为统一接口,也是装饰类和被装饰类的基本类型。
  • ConcreteComponent为具体实现类,也是被装饰类,他本身是个具有一些功能的完整的类。
  • Decorator是装饰类,实现了Component接口的同时还在内部维护了一个ConcreteComponent的实例,并可以通过构造函数初始化。而Decorator本身,通常采用默认实现,他的存在仅仅是一个声明:我要生产出一些用于装饰的子类了。而其子类才是赋有具体装饰效果的装饰产品类。
  • ConcreteDecorator是具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰哪种类型的ConcreteComponent,从而对其进行装饰。

2、最简单的代码实现装饰器模式

//基础接口
package main.mode.zsms;
 
/**
 * 定义一个对象接口,是被装饰类和装饰类的基本类型,可以给这些对象动态添加职责。
 */
public interface Component {
 
	public void Operation();
}


//具体实现类
package main.mode.zsms;
 
/**
 * 定义了一个具体的对象,是被装饰类,也可以给这个对象添加一些职责。
 */
public class ConcreteComponent implements Component{
 
	@Override
	public void Operation() {
		System.out.println("This is ConcreteComponent");
	}
}


//装饰类
package main.mode.zsms;
 
/**
 * 装饰抽象类,实现了Component,从外类来扩展Component类的功能,
 * 但对于Component来说,是无需知道Decorator存在的。
 */
public abstract class Decorator implements Component{
 
	Component component = null;
	
	//构造函数,引入component对象
	public Decorator(Component component) {
		this.component = component;
	}
	
	/**
	 * 重写Operation方法
	 */
	@Override
	public void Operation() {
		System.out.println("This is Decorator");
		if(component != null) {
			component.Operation();
		}		
	}
	
}


//具体装饰类  ConcreteDecoratorA
package main.mode.zsms;
 
/**
 * 具体的装饰产品类,起到给Component添加职责的功能
 */
public class ConcreteDecoratorA extends Decorator{
 
	//本类的独有属性,区别于ConcreteDecoratorB
	private String addedState;
	
	public ConcreteDecoratorA(Component component) {
		super(component);
	}
	
	@Override
	public void Operation() {
		System.out.println("This is ConcreteDecoratorA");
		component.Operation();
		addedState = "装饰了A";
		System.out.println(addedState);
	}
 
}


//具体装饰类  ConcreteDecoratorB
package main.mode.zsms;
 
/**
 * 具体的装饰产品类,起到给Component添加职责的功能
 */
public class ConcreteDecoratorB extends Decorator{
 
	public ConcreteDecoratorB(Component component) {
		super(component);
	}
 
	@Override
	public void Operation() {
		System.out.println("This is ConcreteDecoratorB");
		component.Operation();
		AddedBehavior();
	}
	
	private void AddedBehavior() {
		System.out.println("装饰了B");
	}
}

测试类

package main.mode.zsms;
 
public class DecoratorTest {
 
	public static void main(String[] args) {
		Component component = new ConcreteComponent();
		component.Operation();
		
		System.out.println("---------华丽丽的分割线---------");
		
		Component component1 = new ConcreteDecoratorA(new ConcreteComponent());
		component1.Operation();
		
		System.out.println("---------华丽丽的分割线---------");
		
		Component component2 = new ConcreteDecoratorB(new ConcreteComponent());
		component2.Operation();
	}
 
}

结果

从测试类可以看出,我分了三部分测试

第一部分是没有进行装饰下的情况;

第二、三部分是有装饰的情况。

应用场景:

转载:https://blog.csdn.net/zaoan_2010/article/details/83308891

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值