本文介绍了7样的结构模型中的其余2种:轻量级、代理模式。

一、享元模式FlyWeight

享元模式比較简单且重要,在非常多场合都被用到。仅仅只是封装起来了用户看不到。其概念:运用共享内存技术最大限度的支持大量细粒度的对象。

这个概念给的有些抽象,说白了就是假设内存中存在某个对象A。假设再次须要使用对象A的时候假设内存中有A这个对象就直接使用它,不要再次new了。假设没有,则又一次new一个。基于这个特点,享元模式使用时通常会给待訪问对象传递一个Tag,用来标识这个对象,并且要同一时候使用抽象工厂的方法进行訪问。

有点相似单例模式,仅仅只是单例内存中仅仅有一个对象,而享元模式是确保同样Tag的对象有且仅仅有一个。

1.Flyweight 描写叙述一个接口,通过这个接口flyweight能够接受并作用于外部状态。

public interface Flyweight {
    void action(int arg);
}

2.ConcreteFlyweight实现Flyweight接口,并为内部状态(假设有的话)添加存储空间。ConcreteFlyweight对象必须是可共享的。

它所存储的状态必须是内部的;即,它必须独立于ConcreteFlyweight对象的场景。

public class FlyweightImpl implements Flyweight {

public void action(int arg) {
        // T*DO Auto-genera*ed method stub
        System.out.println(*參数值: " + arg);
    }
}

3. FlyweightFactory      创建并管理flyweight对象。确保合理地共享flyweight。当用户请求一个flyweight时,flyweightFactory对象提供一个已创建的实例或者创建一个(假设不存在的话)。

public class FlyweightFactory {

private static Map flyweights = new HashMap();
    
    public FlyweightFactory(String arg) {
        flyweights.put(arg, new FlyweightImpl());
    }
    
    public static Flyweight getFly*eight(String key) {
        if (flyweights.get(key) == null) {
            flyweights.put(key, new FlyweightImpl());
        }
        return flyweights.get(key);
    }
    
    public static int getSize() {
        return flyweights.size();
    }
}

測试代码:

public class Test {

public static void main(String[] args) {
        // TODO Auto-generated method stub
        Flyweight fly1 = FlyweightFactory.getFlyweight("a");
        fly1.action(1);
        
        Flyweight fly1 = FlyweightFactory.getFlyweight("a");
        System.out.println(fly1 == fly2);
        
        Flyweight fly3 = FlyweightFactory.getFlyweight("b");
        fly3.action(2);
        
        Flyweight fly4 = FlyweightFactory.getFlyweight("c");
        fly4.action(3);
        
        Flyweight fly5 = FlyweightFactory.getFlyweight("d");
        fly4.action(4);
        
        System.out.println(FlyweightFactory.getSize());
    }
}

适用性:

1.一个应用程序使用了大量的对象。

2.全然因为使用大量的对象,造成非常大的存储开销。

3.对象*大多数状态都可变为外部状态。
4.假设删除对象的外部状态,那么能够*相对较少的共享对象代替非常多组对象。
5.应用程序不依赖于对象标识。因为Flyweight对象能够被共享,对于*念上明显有别的对象。标识測试将返回真值。

能够看到前面有篇博文讲Fragment的使用,里面有好几个Fragment就是用的享元模式。另外。像线程池等也是用的享元模式。

在listview的适配器刷新为了更加流畅不必每次都new。对convertView的处理也是享元模式。

也可參考链接:http://blog.csdn.net/jason0539/article/details/22908915

二、代理模式Proxy

为其它对象提供一种代理以控制对这个对象的訪问。

事实上这个思想非常easy,如银行的快捷支付就是一个典型的样例。购物时本来要从银行里拿钱。走银行的通道,因为你的钱本来就在银行放着。支付宝来了,说不用。我先替你垫着,然后支付宝给你出钱,过后支付宝拿着单子找银行要钱。这就是代理模式。

1.Subject 主题,是RealSubject和Proxy共同调用的接口,比方上面提到的付钱。这是约束支付宝和银行的共同接口。

public interface Object {
    void action();
}

2.RealSubject 定义Proxy所代表的实体。这里就像“银行通道”。

public class ObjectImpl implements Object {

public void action() {
        System.out.println("========");
        System.out.println("========");
        System.out.pr*ntln("这是被代理的类");
        System.out.println("========");
        System.out.println("========");
    }
}

3.Proxy代理。相应上面的支付宝

public class ProxyObject implements Object {

Object obj;
    
    public ProxyObject() {
        System.out.println("这是代理类");
        obj = new ObjectImpl();
    }
    
    public void action() {
        System.out.println("代理開始");
        obj.action();
        System.out.println("代理结束");
    }
}

測试代码:

public class Test {

public static void main() {
    Object obj = new ProxyObject();
        obj.action();
    }
}

从上面能够看到,代理模式和适配器模式非常之像。都是在一个类里维持了还有一个类的抽象接口,然后实例化这个接口去做一些操作。

但代理模式跟适配器模式最大的差别是:代理类和被代理的对象类实现了共同的接口。如同支付宝和银行都提供取钱这个共同的操作。

但,适配器模式不同。适配器类和要适配的类相应的接口是不一样的。这本身就是适配的目的所在,将原有类的一个接口适配成另外一个接口供外围调用。举个样例,我要想送礼,买了一个2万的奢侈品,这个接口是“买东西”。然后我把东西给某高官送过去了,高官当然不会要嘛,就拿着东西去商场退货。这个接口是“退货”。

最后嘛,钱就到高官手里了。这就是适配器模式,“买东西”和“退货”属于两个不同的接口。

至于外观模式,举个样例,要打造一部手机,须要生产、研发、销售三大环节。每个环节都有大量的步骤,比方生产得採购原材料吧,採购时是不是先紧着亲戚的厂来点回扣吧,东西买回来要组装生产,扣点生产线上小娄娄的钱。偷个工减点料,一倒手又是银子吧!但给大领导汇报你这么整仅仅有找死,于是将大量步骤封装再封装,对大老板说这个生产嘛。

。研发嘛。。

。销售嘛,三个接口。这就是外观模式。

至此5种创建型模式、7种结构型模式已交代完成,明天開始11种行为型模式。

代理模式亦可參考链接:链接1  链接2

版权声明:本文博客原创文章。博客,未经同意,不得转载。

Java经典23结构模型的设计模式(三)------附加代理模式、适配器型号、Facade模式的差异的更多相关文章

  1. Java经典23种设计模式之行为型模式(三)

    本文接着介绍11种行为型模式里的备忘录模式.观察者模式.状态模式. 一.备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态.这样以后就能够将该对象恢复到原先保存的状 ...

  2. Java经典23种设计模式之创造型模式(一)

    设计模式被称为程序猿的内功,之前零零散散的看过一大部分,但自己么有总结过.故此次在这里总结下.值得一提的是,设计模式并不是Java所特有.由于一直搞Android.这里就用Java为载体.最经典的设计 ...

  3. Java经典23种设计模式之行为型模式(二)

    本文接着介绍行为型模式里的解释器模式.迭代器模式.中介者模式. 一.解释器模式Interpret 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言的中的句子. 1 ...

  4. Java经典23种设计模式之结构型模式(一)

    结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...

  5. Java开发中常用的设计模式(三)---建造者模式

    一. 模式结构 建造者模式主要包含四个角色: Product:产品角色. Builder:抽象建造者.它声明为创建一个Product对象的各个部件指定的抽象接口. ConcreteBuilder:具体 ...

  6. Java经典23创意模式设计模式(两)

    本文介绍5其余两种创意模式:模型构建器(Builder).原型模型(PROTOTYPE). 一.建造者模式(别名:生成者模式) 将复杂对象的构建和它的表示分离,使得相同的构建过程能够创建不同的表示. ...

  7. Java设计模式(三)原型模型 适配器型号

    (五岁以下儿童)原型模型 Prototype 样机模型旨在复制一个现有对象来创建新对象.而不是通过的方式的实例.原型模式须要实现 Cloneable 接口.覆写clone方法,复制分为浅复制.深复制. ...

  8. Java模式(适配器型号)

    今天阅读Java该适配器模式,这里有一个小的总结和下谈感受.对于将来使用. 首先.让我们有关适配器先说说. 适应是“来源”至“目标”适应.其中连接这两个的关系是适配器.它负责“源”过度到“目标”. 举 ...

  9. Java中23种经典设计模式详解

    Java中23种设计模式目录1. 设计模式 31.1 创建型模式 41.1.1 工厂方法 41.1.2 抽象工厂 61.1.3 建造者模式 101.1.4 单态模式 131.1.5 原型模式 151. ...

随机推荐

  1. hdu3804(树链剖分)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3804 题意:给定一棵n个结点的树及边权,回答m个询问(x,y)满足以下条件的边权: 1)该边在结点1~ ...

  2. shell命令批量杀死MySQL连接进程

    (1)将全部的MySQL连接进程杀掉 for i in `mysql -uroot -pzhangyun -Bse "show processlist" | grep -v &qu ...

  3. Android之Http通信——3.Android HTTP请求方式:HttpURLConnection

    3.Android HTTP请求方式之HttpURLConnection 引言: 好了,前两节我们已经对HTTP协议进行了学习.相信看完前两节的朋友对HTTP协议相比之前 应该更加熟悉吧.好吧.学了要 ...

  4. Oracle语句集锦

    创建用户并赋予dba权限 1)进入cmd 2)sqlplus / as sysdba 或者 sqlplus sys/密码 as sysdba SQL> conn sys/wcq123@orcl ...

  5. asp.net Login控件基本属性及事件说明

    原文:asp.net Login控件基本属性及事件说明 Login系列控件是微软为了简化我们的开发过程,为我们进行常规的安全开发提供块捷途径. Login系列控件包含下列控件: Login 登录控件 ...

  6. ASP.NET关于Login控件使用,LoginView 控件,CreateUserWizard 控件

    原文:ASP.NET关于Login控件使用,LoginView 控件,CreateUserWizard 控件 Login控件它是属于Membership服务的一部分,必须配置Membership提供程 ...

  7. VBA怎样统计同一类型的数据的总和

    今天是2014-11-01 是周末,忙了一周了,最终能够闲下来了.想起近期工作用到的VBA的一个场景,结合VBA的数组,所以就想试试看.结果还好.出来了.这年头,又玩起了VB了,经过多时才接受了VB的 ...

  8. Windows Phone开发(39):漫谈关键帧动画上篇

    原文:Windows Phone开发(39):漫谈关键帧动画上篇 尽管前面介绍的几种动画会让觉得很好玩了,但是,不知道你是否发现,在前面说到的一系列XXXAnimation中,都有一个共同点,那就是仅 ...

  9. SICP 1.20经验

    1.20 两者之间的主要区别是,使我们明白的操作顺序. 网上找一些答案,都死了扩大. 我们所从事的IT的. 展开搞死人IT实践. 首先考虑应用程序 我们得到 gcd(206, 40) -> gc ...

  10. HTML5 RPG游戏引擎 地图实现篇

    一,话说全国年夜事   前没有暂看到lufy的专客上,有一名伴侣念要一个RPG游戏引擎,出于兴趣筹办入手做一做.因为我研讨lufylegend有冶时间了,对它有必然的依赖性,因而便筹办将那个引擎基于 ...