专业编程基础技术教程

网站首页 > 基础教程 正文

一天一个设计模式——(8)装饰器模式

ccvgpt 2024-08-04 12:15:24 基础教程 10 ℃

(八)装饰器模式

装饰器模式(Deorator)指在不改变原有对象的基础上,动态的给一个对象添加功能。它是通过关联机制,即在一个类中嵌入另一个类的对象的引用。与继承的方式实现功能扩展相比更加灵活。

1,装饰器模式设计原则

1,抽象组件(Component):接口或抽象类,用于定义被装饰对象的行为。

一天一个设计模式——(8)装饰器模式

2,具体组件(ConcreateComponent):实现或基础抽象组件的一个具体组件,即被装饰对象。

3,抽象装饰器(Decorator):即具体装饰器的通用抽象,其内部有一个属性指向Component。

4,具体装饰器(ConcreateDecorator):Decorator的具体实现。

2,简单案例

比如汉堡店,有一个提供主食的服务,其中一个主要服务为汉堡。现在通过构造抽象汉堡装饰器,能够在提供汉堡的基础上实现提供牛奶,可乐等服务,动态的添加服务产品。

 public abstract class Component {
     protected abstract String getMessage();
     protected abstract int getPrice();
 }
 public class Hamburger extends Component {
     protected String getMessage(){
         return "汉堡";
     }
     public int getPrice(){
         return 3;
     }
 }
 public abstract class HamburgerDecorator extends Component {
     private Component component;
     public HamburgerDecorator(Component component){
         this.component = component;
     }
 
     @Override
     protected String getMessage() {
         return this.component.getMessage();
     }
 
     @Override
     public int getPrice() {
         return this.component.getPrice();
     }
 }
 public class ColaDecorator extends HamburgerDecorator  {
     public ColaDecorator(Component component){
         super(component);
     }
 // 装饰器可以实现自己功能
     protected void dosomething(){}
     @Override
     protected String getMessage() {
         return super.getMessage()+"colo";
     }
 
     @Override
     public int getPrice() {
         return super.getPrice()+2;
     }
 }
 public class MilkDecorator extends HamburgerDecorator {
     public MilkDecorator(Component component) {
         super(component);
     }
 
     @Override
     protected String getMessage() {
         return super.getMessage()+"牛奶";
     }
 
     @Override
     public int getPrice() {
         return super.getPrice()+2;
     }
 }
 
 public class Client {
     public static void main(String[] args) {
         Component component;
 //        套餐基本服务是有一个汉堡
         component = new Hamburger();
 //        现在想在汉堡的基础上继续买一杯可乐
         component = new ColaDecorator(component);
 //        再买一杯牛奶,返回的始终是汉堡对象
         component = new MilkDecorator(component);
 
         System.out.println(component.getMessage()+",总价:"+component.getPrice());
     }
 }

3,装饰器模式的点评

装饰器模式能够动态的实现功能的修改,它本质是通过抽象装饰器,而装饰器内维护了一个顶级对象的引用。这样,通过关联而减少了继承的依赖性,同样实现了功能的扩展。但是功能组件的过于复杂,会增加程序的复杂性。

与代理模式相比,代理模式更偏向于对象保护和增强,统一的事情让统一的人去做。而装饰器模式更强调自身功能的扩展。

最近发表
标签列表