装饰模式
一:什么是装饰模式?
装饰模式是不在改变原文件和使用继承的情况下,动态的扩展一个对象的功能,它是通过创建一个包装对象(装饰)来包裹真实的对象。也就是说装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一接口,尔装饰对象持有被装饰对象的实例。
二:装饰模式的优缺点:
优点:1.装饰模式可以提供比继承更多的灵活性
2.通过使用不同的装饰类及这些类的排列组合可以设计出很多不同的组合。
缺点:使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。
使用装饰模式会产生比使用继承关系更多的对象。
更
多的对象会使得查错变得困难,特别是这些对象看上去都很相像。
用途:
当需要给一个类添加新的行为的时候,但基于开闭原则,就使用装饰模式。
使用装饰模式会产生比使用继承关系更多的对象。
更
多的对象会使得查错变得困难,特别是这些对象看上去都很相像。
用途:
当需要给一个类添加新的行为的时候,但基于开闭原则,就使用装饰模式。
三:装饰模式的应用场景:
1、需要扩展一个类的功能。
2、动态的为一个对象增加功能,而且还能动态撤销。
下面我们以奶茶作为例子
package Zhuangshimosi;
/**
* 奶茶类 定义为接口
* @author Administrator
*
*/
public interface TeaMilk {
public String description();
public float price();
}
/**
* 原味奶茶 实现接口 实例化接口
* @author Administrator
*
*/
public class GrashingTeaMilk implements TeaMilk {
@Override
public String description() {
// TODO Auto-generated method stub
return "原味奶茶";
}
@Override
public float price() {
// TODO Auto-generated method stub
return 4f;
}
}
/**
* 装饰修饰类 定义为抽象或接口
* @author Administrator
*
*/
public class Decrator implements TeaMilk{
//定义和奶茶的关联关系
private TeaMilk teaMilk;
public Decrator(TeaMilk teaMilk){
this.teaMilk=teaMilk;
}
@Override
public String description() {
// TODO Auto-generated method stub
return teaMilk.description();
}
@Override
public float price() {
// TODO Auto-generated method stub
return teaMilk.price();
}
}
/**
* 冰修饰类 继承装饰类
* @author Administrator
*
*/
public class IceDecrator extends Decrator {
public IceDecrator(TeaMilk teaMilk) {
super(teaMilk);
// TODO Auto-generated constructor stub
}
public String description(){
return super.description()+"+冰";
}
public float price(){
return super.price()+1f;
}
}
/**
* 测试类
* @author Administrator
*
*/
public class Test {
public static void main(String[] a){
//创建一个原味奶茶对象
GrashingTeaMilk gt= new GrashingTeaMilk();
//创建冰修饰对象
IceDecrator id=new IceDecrator (gt);
System.out.println("您点了一个奶茶为:"+id.description());
System.out.print("您需要支付"+id.price());
}
}
输出结果:
您点了一个奶茶为:原味奶茶+冰
您需要支付5.0