您的位置:首页 > 其它

设计模式之装饰模式

2016-03-06 19:54 281 查看
装饰模式主要是为了扩展被装饰类的功能,而且是动态的.装饰类中需要注入被装饰对象,且装饰类和被装饰类都需要实现同一个接口.

装饰模式步骤如下:

编写一个类,实现与被装饰的类相同的接口,目的是使他们有相同的行为

定义一个实例变量,引用被装饰对象,目的和原来的老对象进行交接

定义构造方法,把被装饰对象注入进来(也可以使用其他方式注入)

对于不需要改写的方法,调用被装饰对象的.

对于要改写的方法,改写即可

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

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式 扩展