【Java设计模式】- 装饰器模式

来源:互联网 发布:mysql面试题及答案 编辑:程序博客网 时间:2024/06/18 15:08

概述

    装饰器模式:可以动态的为运行时的类添加行为。相比继承而言,继承是直接对某个类的行为进行扩展而装饰器模式是对某个对象进行扩展。
    原理:增加一个修饰类去实现被修饰类相同的接口,同时接收一个被修饰类的实例,并在修饰类中用自己的方法去包裹被修饰类的方法。

    经常使用的Collections的synchronizedList(List<T> list)等方法就是使用了装饰器模式。

简单实现

说明:
  • Conponent接口:被修饰类的接口。
  • ConcreateConponent:被修饰类的具体实现。
  • Decorator:装饰器实现。

Conponent:
只有一个方法
public interface Conponent {void conponentMethod();}
ConcreateConponent:
具体实现
public class ConcreateConponent implements Conponent {@Overridepublic void conponentMethod() {System.out.println("the original conponent method run");}}

Decorator:
实现了Conponent接口从而拥有了和Conponent的实例一样的行为
接收一个Conponent的实例并用新的方法去包裹原来的方法。
这里的实现在conponentMethod执行之前和之后做了一个控制台输出,同时将该方法用一个互斥锁同步,使得conponentMethod方法线程安全。
public class Decorator implements Conponent {private Conponent source;private Object mutex = new Object();public Decorator(Conponent source) {this.source = source;}@Overridepublic void conponentMethod() {synchronized (mutex) {System.out.println("do something before method run");source.conponentMethod();System.out.println("do something after method run");}}}
测试:
public class Test {public static void main(String[] args) {Conponent source = new ConcreateConponent();Decorator decorator = new Decorator(source);decorator.conponentMethod();}}
输出:
do something before method runthe original conponent method rundo something after method run

相比之下因为是使用的类的实例也就是对象,相比继承来说更加的灵活。同时不用新增更多的类定义。


原创粉丝点击