装饰器模式
装饰器模式:在不改变被装饰类的结构的前提下,允许向。一个现有的对象添加新的功能。其实现原理是创建了一个装饰类依赖于被装饰类,为其添加新的功能。其作用于代理模式很像,代理依赖于继承,而装饰器采用组合。可以说代理模式可以隐藏内部实现的细节,而装饰器必须显示的传入其被装饰的对象。
抽象组件(Component):被装饰的抽象对象。
具体组件(ConcreteComponent):被装饰的具体组件
抽象装饰类(Decorator):拥有抽象组件的引用,和实现抽象组件的方法
具体装饰类(ConcreteDecorator):具体的装饰对象。
具体的例子
有一碗面,可以是牛肉面,羊肉面。。等,可以往里放辣椒,加醋。
CookingNoodle :煮面的接口(抽象组件)
CookingMuttonNoodle 和CookingBeefNoodle :牛肉面和羊肉面(具体组件)
NoodleDecorator:面条装饰器(抽象装饰器组件)
ChiliNoodleDecorator :加辣椒(具体装饰器)
VinegarNoodleDecorator :醋(具体装饰器)
/**
* 煮面,定义抽象的组件
* @author sky_
*
*/
interface CookingNoodle {
void cooking();
}
/**
* 牛肉面,具体组件
* @author sky_
*
*/
public class CookingBeefNoodle implements CookingNoodle{
@Override
public void cooking() {
System.out.println("牛肉面一碗");
}
public static void main(String[] args){
CookingNoodle cookingNoodle = new ChiliNoodleDecorator(new CookingBeefNoodle());
cookingNoodle.cooking();
cookingNoodle = new VinegarNoodleDecorator(new CookingMuttonNoodle());
cookingNoodle.cooking();
}
}
/**
* 羊肉面,具体的组件
* @author sky_
*
*/
class CookingMuttonNoodle implements CookingNoodle{
@Override
public void cooking() {
System.out.println("羊肉面一碗");
}
}
/**
* 抽象的装饰类
* @author sky_
*
*/
class NoodleDecorator implements CookingNoodle{
private CookingNoodle CookingNoodle;
public NoodleDecorator(CookingNoodle cookingNoodle) {
super();
CookingNoodle = cookingNoodle;
}
@Override
public void cooking() {
CookingNoodle.cooking();
}
}
class ChiliNoodleDecorator implements CookingNoodle{
private CookingNoodle CookingNoodle;
public ChiliNoodleDecorator(CookingNoodle cookingNoodle) {
super();
CookingNoodle = cookingNoodle;
}
@Override
public void cooking() {
CookingNoodle.cooking();
addChili();
}
public void addChili(){
System.out.println("加辣椒");
}
}
class VinegarNoodleDecorator implements CookingNoodle{
private CookingNoodle CookingNoodle;
public VinegarNoodleDecorator(CookingNoodle cookingNoodle) {
super();
CookingNoodle = cookingNoodle;
}
@Override
public void cooking() {
CookingNoodle.cooking();
addVinegar();
}
public void addVinegar(){
System.out.println("加醋");
}
}
运行结果
总结
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是用组合来代替继承实现类扩展功能的一个方案。