专栏首页wOw的Android小站[设计模式]之十九:装饰模式

[设计模式]之十九:装饰模式

定义

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

介绍

由定义,给一个类或对象添加功能,为了不破坏类的结构,可以有两种方式:

  • 继承 使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。
  • 关联 将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为,我们称这个嵌入的对象为装饰器(Decorator)

UML

示例代码

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

public class ConcreateComponent extends Component {
	@Override
	public void Operation() {
		// TODO Auto-generated method stub
		System.out.println("basic operation");
	}
}

public class Decorator extends Component {
	
	protected Component component;
	
	public void SetComponent(Component component) {
		this.component = component;
	}

	@Override
	public void Operation() {
		// TODO Auto-generated method stub
		if (component != null) {
			component.Operation();
		}
	}

}

public class DecoratorA extends Decorator {

	@Override
	public void Operation() {
		// TODO Auto-generated method stub
		super.Operation();
		newBehavior();
	}
	
	private void newBehavior() {
		System.out.println("Add new behavior AAA");
	}
	
}

public class DecoratorB extends Decorator {

	@Override
	public void Operation() {
		// TODO Auto-generated method stub
		super.Operation();
		newBehavior();
	}
	
	private void newBehavior() {
		System.out.println("Add new behavior BBB");
	}

}

public static void main(String[] args) {
  // TODO Auto-generated method stub
  ConcreateComponent c = new ConcreateComponent();
  DecoratorA a = new DecoratorA();
  DecoratorB b = new DecoratorB();

  a.SetComponent(c);
  a.Operation();

  b.SetComponent(a);
  b.Operation();
}

//输出
basic operation
Add new behavior AAA
basic operation
Add new behavior AAA
Add new behavior BBB

基本思路是,在ConcreateComponent做一些基本操作,然后创建装饰器,如果需要给对象增加新的特性,就把该对象放入对应的装饰器中。

尽量保持Component作为一个轻类,不要做太多逻辑。

评价

优缺点

优点

  • 不会破坏类的封装性,而且耦合性比继承要低,灵活性比继承高。
  • 可以动态的拓展一个对象的功能。
  • 可以用多个装饰器按照不同顺序组合出不同的对象。
  • 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类。符合开闭原则。

缺点

  • 需要创建更多的对象。
  • 因为装饰器使用灵活,使用的顺序也能不同,可能引起的错误会比较隐蔽。

使用场景

当系统需要新功能的时候,如果新功能只是为了满足某个条件下才会执行的行为,则不建议修改原类,而是使用装饰模式,把要装饰的功能放在特定类中,然后用这个类包装它所要装饰的对象。这样,客户代码可以根据情况在运行时选择装饰功能包装对象。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [设计模式]之二十:模板方法模式

    定义一个操作中算法的骨架,将一些步骤延迟到子类中。模板方法使得子类可以不改变算法的结果即可重定义该算法的某些特定步骤。

    wOw
  • [设计模式]之十六:观察者模式

    观察者模式又叫发布订阅模式(public/subscribe),定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,...

    wOw
  • [设计模式]之八:中介者模式

    用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

    wOw
  • DDD设计中的Unitwork与DomainEvent如何相容?

    最近在开发过程中,遇到了一个场景,甚是棘手,在这里分享一下。希望大家脑洞大开一起来想一下解决思路。鄙人也想了一个方案拿出来和大家一起探讨一下是否合理。

    Zachary_ZF
  • Java外观模式(门面模式Facade)

      外观模式也叫门面模式,是开发过程中使用频率非常高的一种设计模式,但非常容易理解。

    用户4919348
  • 【Java工程师必备素质】你设计的接口,够优雅吗?

    很多非资深接口设计者,在设计接口时,总认为接口所做的事越多,越牛叉,这是非常严重的错误认识。

    用户5224393
  • 如何设计一个良好的接口

    在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性、接口的稳定性、接口的跨域性、接口的协议规则、接口的路径规则、接口单一原则、接口过...

    好好学java
  • 如何设计一个良好的接口

    在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性、接口的稳定性、接口的跨域性、接口的协议规则、接口的路径规则、接口单一原则、接口过...

    用户1093975
  • 你设计的接口,够优雅吗?

    很多非资深接口设计者,在设计接口时,总认为接口所做的事越多,越牛叉,这是非常严重的错误认识。

    良月柒
  • java编程_socket_套接字_网络编程_简易的GUI多线程聊天程序

    ===============================================================

    Hongten

扫码关注云+社区

领取腾讯云代金券