核心模块:抽象组件,具体组件,抽象装饰者,具体装饰者
所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git
使用场景:给对象增加额外行为,用于替代继承的技术,动态给对象增加额外职责;
优点:符合opc原则,可以重复装饰,提供了一个比继承更加灵活的方式,不会导致类的个数急剧增加;
缺点:会产生许多小对象,灵活的同时也意味者比继承更加容易出错;
注意:
1,实际上就是新建一个类,包裹了目标类,新建类和目标类的行为一致;
2,装饰者模式与代理模式相同点:装饰者和被装饰者、代理类和真实代理类都实现通一个接口,可以在真实对象方法前面或者后面加上自定义方法;
3,装饰者模式与代理模式不同点:装饰者模式中被装饰对象是当作参数传入进来的,而且代理模式,一般只代理一个类,通常这个类在代理类的内部实例化;代理类和被代理类的关系通常编译时就被确定了,而装饰者和被装饰者的关系运行时被递归构造;
/**
* Created by tory on 2018/1/6.
* 装饰者模式
* 就是在已有的类包裹一层
*/
public class DecoratorPattern {
public static void main(String[] args) {
FishFlavoredPork dish1 = new FishFlavoredPork();
RiceDecorator rice = new RiceDecorator(dish1);
PackageDecorator pack = new PackageDecorator(rice);
System.out.println("--->"+pack.getDescription()+" -->共计:"+pack.coast()+" 元");
}
}
//Component抽象构件
abstract class Component {
protected String description = "";
String getDescription(){
return description;
}
abstract public Double coast();
}
//ConcreteComponent具体构件
class FishFlavoredPork extends Component {
FishFlavoredPork() {
description = "鱼香肉丝";
}
public Double coast() {
return 12.9;
}
}
//ConcreteComponent具体构件
class TwiceCookPork extends Component {
TwiceCookPork() {
description = "回锅肉";
}
public Double coast() {
return 9.9;
}
}
//Decorator抽象装饰者
abstract class Decorator extends Component {
Component component;
Decorator(Component component) {
this.component = component;
}
abstract String getDescription();
}
//ConcreteDecorator 具体装饰者
class PackageDecorator extends Decorator {
//在愿基础上增加餐盒
PackageDecorator(Component component) {
super(component);
}
@Override
String getDescription() {
return component.getDescription() + " ,餐盒";
}
@Override
public Double coast() {
return component.coast() + 2;
}
}
//ConcreteDecorator 具体装饰者
class RiceDecorator extends Decorator {
//增加米饭修饰
RiceDecorator(Component component) {
super(component);
}
@Override
String getDescription() {
return component.getDescription() + " ,米饭";
}
@Override
public Double coast() {
return component.coast() + 2.0;
}
}
//ConcreteDecorator 具体装饰者
class SmallDishes extends Decorator {
SmallDishes(Component component) {
super(component);
}
@Override
String getDescription() {
return component.getDescription() + " ,小菜";
}
@Override
public Double coast() {
return component.coast() + 1;
}
}
内容打印
Hello World!
--->鱼香肉丝 ,米饭 ,餐盒 -->共计:16.9 元