【23种设计模式】结构型模式(装饰,外观,享元,代理模式)

9.装饰模式【Decorator】

【概念】装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。
使用Decorator的理由是:这些功能需要由用户动态决定加入的方式和时机.Decorator提供了”即插即用”的方法,在运行期间决定何时增加何种功能.
【个人理解】可用于扩展,增加装饰器扩展构件方法,不侵入原接口与实现类,实现接口与实现分离
用于接口方法的增强与升级而不是增加新方法,实现原理通过装饰实现接口并聚合接口,用聚合的接口方法增加扩展功能后重新实现接口方法。
在这里插入图片描述角色:
Component:被装饰的抽象构件
Concretecomponent:被装饰的具体构件实现抽象构件
Decorator:装饰器,实现抽象构件,聚合具体构件,带有抽象方法,此方法与抽象构件方法一致
Concretedecorator:具体装饰器,继承装饰器,用具体构件的方法加上扩展方法重新实现抽象构件的方法。
【要领】实现接口,聚合接口,装饰扩展方法
案例:sitmesh

public interface Component{//顶级接口
    public void Operation();
}
public class Decorator implements  Component{//装饰器实现顶级接口
    private Component component;
public getset..
    public void operation(){
        system.out.print(“*************”);
        component.operation();
        system.out.print(“*************”);
}
}
public Concretecomponent implements  Component{//被装饰构件实现顶级接口
    public void operation(){
        system.out.pring(“working..”);
    }
}
class Test{
    public static void main(String[] args){
        Component c=new Decorator();
       c.set(new Concretecomponent);
        c.operation();  
}

10.外观模式【Facade】

【解释】门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用,减少复杂性。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。
用于简化使用方法,通过对外一个简单的接口提供使用者调用,接口实现复杂的过程,调用者无需了复杂过程,只针对简单接口调用功能即可【迪米特法则,最少知识原则】
在这里插入图片描述

11.享元模式【Flyweight】

【解释】享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。
创建对象池,共享细粒度对象,降低系统资源开销;享元工厂获取已经存在的享元对象,如果该享元对象在工厂池中不存在,则工厂先创建此对象再加入工厂池,然后返还给调用者。
在这里插入图片描述角色:
Flyweightfactory:享元工厂,用于获取一级管理享元对象
Flyweight:抽象享元类
Concreteflyweight:具体享元类
Unsharedconcreteflyweight:不共享的类
案例:jvm的变量常量池,String a=”abc”;String b=”abc”;a==b;,String对象的创建方式,String是final的创建后就不允许更改,其值就存放在常量池中。
【要领】
1.创建个map存放对象,作为对象池
2.获取KEY判断是否对应的对象在对象池中存在,存在返回不存在创建后返回。

12.代理模式【Proxy】

【解释】代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。
类似装饰模式,代理类与被代理类实现同一个接口,代理类聚合被代理类,用被代理类的实现方法实现代理类的实现方法。
【个人理解】类似装饰模式,区别仅仅是,装饰模式扩展方法,而代理模式主要控制方法是否执行,就是表现不一样。
在这里插入图片描述角色:
Subject:抽象角色
Realsubject:真实角色
Proxy:代理角色
代理角色与真实角色共同实现抽象角色接口,因此可以用代理角色替代真是角色
【要领】实现接口,引用接口实现,用引用的实现类方法实现接口方法
例子:

    Interface subject{//接口
        public void request();
    }
    class proxy implements subject{//代理类
        private Subject sub;
    public void request(){
        Sub.request();
    }
    }
    class realsubject implements subject{//真实实现类
        public void request(){
            System.out.print(“oh my god”);
    }
    }
    class test{
        public static void main (String[] arg){
            Subject prox=new proxy();
    Prox.sub=new realsubject();
          Prox.request();
    }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值