设计模式之装饰模式

装饰模式主要是为了扩展被装饰类的功能,而且是动态的.装饰类中需要注入被装饰对象,且装饰类和被装饰类都需要实现同一个接口.

装饰模式步骤如下:

  1. 编写一个类,实现与被装饰的类相同的接口,目的是使他们有相同的行为
  2. 定义一个实例变量,引用被装饰对象,目的和原来的老对象进行交接
  3. 定义构造方法,把被装饰对象注入进来(也可以使用其他方式注入)
  4. 对于不需要改写的方法,调用被装饰对象的.
  5. 对于要改写的方法,改写即可

装饰类和被装饰类实现同一个接口

package design.decorator;

/**
 * 装饰类和被装饰的类都会实现这个接口
 * 
 * @author Minhellic
 *
 */
public interface Sourcable {
    /**
     * 演示在装饰类中重写这个方法
     */
    public void method_1();
    /**
     * 演示在装饰类中直接调用被装饰类的方法
     */
    public void method_2();
}

被装饰的类

package design.decorator;

/**
 * 被装饰的类
 * @author Minhellic
 *
 */
public class Source implements Sourcable {
    @Override
    public void method_1() {
        System.out.println("Source.method_1 ...");
    }

    @Override
    public void method_2() {
        System.out.println("Source.method_2 ...");      
    }

}

装饰类

package design.decorator;

/**
 * 装饰类,实现和被装饰类同样的接口
 * 改写需要改写的方法,对于不需要改写的方法,直接调用注入的被包装类的方法
 * @author Minhellic
 *
 */
public class Decorator implements Sourcable {
    //定义被包装类的实例,以便调用其中的方法
    private Source source;
    //通过构造方法将被包装类注入进装饰类
    public Decorator(Source source) {
        this.source = source;
    }

    /**
     * 在装饰类中,改写这个方法
     */
    @Override
    public void method_1() {
        System.out.println("Decorator.method_1 ...");

    }

    /**
     * 在装饰类中,调用被装饰类的方法
     */
    @Override
    public void method_2() {
        source.method_2();
    }

}

测试类

package design.test;

import design.decorator.Decorator;
import design.decorator.Sourcable;
import design.decorator.Source;

public class Test {
    public static void main(String[] args) {
        /*
         * 创建接口的实例对象时,使用的是装饰类的实例,
         * 使用构造方法将被装饰类注入进去
         */
        Sourcable decorator = new Decorator(new Source());

        decorator.method_1();
        decorator.method_2();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章