装饰者模式
本质:
动态的将责任附加到对象上。
若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
java.io 里面用到了装饰器模式
UML图:
下面我将给出实现。大致思想:(没有装饰基类)
Basket接口类:
public interface Basket
{
void show();
}
一个Basket的具体类:
public class myBasket implements Basket
{
public void show()
{
System.out.println("This is my Basket,it contains:");
}
}
下面是两个装饰者类:
1:向篮子中加入一个苹果:
public class appleDecorator implements Basket
{
private Basket b; //往哪个篮子里面加
appleDecorator(Basket b){this.b=b;}
public void show()
{
b.show();
System.out.println("apple");
}
}
2:加入香蕉:
public class bananaDecorator implements Basket
{
private Basket b;
bananaDecorator(Basket b){this.b=b;}
public void show()
{
b.show();
System.out.println("banana");
}
}
测试函数:
public class test
{
public static void main(String[] args)
{
Basket b=new myBasket(); //创建一个篮子
b=new bananaDecorator(b); //往篮子里加一个香蕉
b=new bananaDecorator(b); //往篮子里加一个香蕉
b=new appleDecorator(b); //往篮子里加一个苹果
//b=new appleDecorator(new bananaDecorator(new bananaDecorator(b)));
//上面实现的是一步一步的加,这里是一次加满,效果一样
b.show();
}
}
输出:
This is my Basket,it contains:
apple
banana
这说明先Apple装饰者先被创建。
适用性
1.需要扩展一个类的功能,或给一个类增加附加责任。
2.需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。
总结:
Decorator模式采用对象组合而非继承的手法,实现了在运行时动态的扩展对象功能的能力,而且可以根据需要扩展多个功能,避免了单独使用继承带来的“灵活性差”和“多子类衍生问题”。同时它很好地符合面向对象设计原则中“优先使用对象组合而非继承”和“开放-封闭”原则。