• 装饰模式


    概述:

           装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。装饰者模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。

           装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为

          

    1.抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象
    2.具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
    3.装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口
    4.具体装饰(Concrete Decorator)角色:负责给构件对象“贴上”附加的责任。
    View Code

    现在需要一个汉堡,主体是鸡腿堡,可以选择添加生菜、酱、辣椒等等许多其他的配料,这种情况下就可以使用装饰者模式。

    public class Jdbct {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Chilli c = new Chilli(new Lettuce(new ChickenHum()));
            System.out.println(c.getName() + "价钱" + c.price());
        }
    
    }
    abstract class Humber {
        protected String name;
        public String getName() {
            return name;
        }
        public abstract int price();
    }
    
    class ChickenHum extends Humber{
    
        public ChickenHum() {
            name = "鸡腿堡";
        }
        @Override
        public int price() {
            // TODO Auto-generated method stub
            return 10;
        }
    }
    
    abstract class Condiment extends Humber {
        public abstract String getName();
    }
    
    class Lettuce extends Condiment {
    
        Humber humber;
        public Lettuce(Humber humber) {
            this.humber = humber;
        }
        @Override
        public String getName() {
            // TODO Auto-generated method stub
            return humber.getName() + "韭菜";
        }
    
        @Override
        public int price() {
            // TODO Auto-generated method stub
            return humber.price() + 2;
        }
    }
    class Chilli extends Condiment {    
        
        Humber humburger;    
            
        public Chilli(Humber humburger){    
            this.humburger = humburger;    
                
        }    
        
        @Override    
        public String getName() {    
            return humburger.getName()+" 加辣椒";    
        }    
        
        @Override    
        public int price() {    
            return humburger.price();  //辣椒是免费的哦    
        }    
    } 
    View Code

    装饰模式在什么情况下使用?

    1.需要扩展一个类的功能,或给一个类增加附加责任
    2.需要动态地给一个对象增加功能,这些功能可以再动态地撤销
    3.需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。
     
    使用装饰模式的优点:
    1.装饰模式与继承关系的目的都是扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性
    装饰模式允许系统动态地决定“贴上”一个需要的“装饰”,或者除掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。
    2.通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
    3.这种比类继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错。
     
    使用装饰模式的缺点:
    1.由于使用装饰模式,可以比使用类继承关系需要较少数的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用类继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。
  • 相关阅读:
    AIX 常用命令
    local_listener 与 remote_listener 参数说明
    IBM AIX 5.3 系统管理 系统启动过程详解
    exp/imp 与 expdp/impdp 对比 及使用中的一些优化事项
    local_listener 与 remote_listener 参数说明
    SSH 连接慢 与 反向解析
    Configuring raw devices (multipath) for Oracle Clusterware 10g Release 2 (10.2.0) on RHEL5OEL5 [ID 564580.1]
    Parameter DIRECT: Conventional Path Export Versus Direct Path Export [ID 155477.1]
    AIX 系统介绍
    Oracle 数据文件(Datafile ) 大小 限制 说明
  • 原文地址:https://www.cnblogs.com/whesuanfa/p/7404548.html
Copyright © 2020-2023  润新知