设计模式之11装饰模式(笔记)

1 定义:

1.1 定义:(Decorator PatternAttach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality.(保持接口不变的情况下,动态地给一个对象添加一些额外的职责。就增加功能来讲,装饰模式相比生成子类更为灵活。)

1.2 通用类图:


要变为更可理解的类图

1.3 通用代码:

角色说明:

Component抽象构件(必须的

Component是一个接口或者是抽象类,定义我们最核心的对象,也就是最原始的对象。

ConcreteComponent具体构件

ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,它是要被装饰的目标。

Decorator装饰角色

Decorator一般是一个抽象类,用来实现接口或者抽象方法,这里面不一定有抽象的方法,但在它的属性里必然有一个private变量指向Component抽象的构件。

ConcreteDecoratorA

ConcreteDecoratorA是具体的装饰类,也就是要附加到ConcreteComponent的事物实现。

一句话:通过具体装饰来为具体构件添砖加料。

	public abstract class Component {
		// 抽象的方法
		public abstract void operate();
	}

	public class ConcreteComponent extends Component {
		// 具体实现
		@Override
		public void operate() {
			System.out.println("do Something");
		}
	}

	public abstract class Decorator extends Component {
		private Component component = null;

		// 通过构造函数传递被修饰者
		public Decorator(Component _component) {
			this.component = _component;
		}

		// 委托给被修饰者执行
		@Override
		public void operate() {
			this.component.operate();
		}
	}

	public class ConcreteDecorator1 extends Decorator {
		// 定义被修饰者
		public ConcreteDecorator1(Component _component) {
			super(_component);
		}

		// 定义自己的修饰方法
		private void method1() {
			System.out.println("method1 修饰");
		}

		// 重写父类的Operation方法
		public void operate() {
			this.method1();
			super.operate();
		}
	}

	public class ConcreteDecorator2 extends Decorator {
		// 定义被修饰者
		public ConcreteDecorator2(Component _component) {
			super(_component);
		}

		// 定义自己的修饰方法
		private void method2() {
			System.out.println("method2修饰");
		}

		// 重写父类的Operation方法
		public void operate() {
			super.operate();
			this.method2();
		}
	}

	public class Client {
		public static void main(String[] args) {
			Component component = new ConcreteComponent();
			// 第一次修饰
			component = new ConcreteDecorator1(component);
			// 第二次修饰
			component = new ConcreteDecorator2(component);
			// 修饰后运行
			component.operate();
		}
	}


2 优点

2.1 装饰类与被装饰类可以独立发展,而不会相互耦合。

2.2 装饰模式是继承关系的一个替代方案。查看Decorator类,不管装饰多少层,返回的对象还是Component,实现的还是isa的关系。

2.3 装饰模式可以动态地扩展一个实现类的功能,其定义如此。

3 缺点

尽量减少装饰叠加类的数量,叠加次数越多,系统的复度越高。

4 应用场景

继承是静态的给类增加功能,而装饰是动态的增加功能;

当业务变更,冒出新需求时,尤其是一个较大的需求时,可以考虑它。

4.1 需要扩展一个类的功能,或给一个类增加额外的功能;

4.2 需要动态地给一个对象增加功能,这些功能可以再动态地撤销;

4.3 需要为一批兄弟类进行改装或加装功能,首选装饰模式。

5 注意事项

6 扩展

7 范例

实例如通用源代码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值