惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
腾讯CDC
V
V2EX
Martin Fowler
Martin Fowler
A
About on SuperTechFans
大猫的无限游戏
大猫的无限游戏
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Check Point Blog
博客园 - 【当耐特】
Cisco Talos Blog
Cisco Talos Blog
The Hacker News
The Hacker News
K
Kaspersky official blog
Security Latest
Security Latest
H
Help Net Security
博客园_首页
美团技术团队
Spread Privacy
Spread Privacy
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
G
Google Developers Blog
NISL@THU
NISL@THU
爱范儿
爱范儿
I
Intezer
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
N
News and Events Feed by Topic
P
Privacy International News Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
雷峰网
雷峰网
人人都是产品经理
人人都是产品经理
V
Vulnerabilities – Threatpost
W
WeLiveSecurity
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
Hacker News: Ask HN
Hacker News: Ask HN
I
InfoQ
The Cloudflare Blog
F
Full Disclosure
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
N
Netflix TechBlog - Medium

博客园 - 李明飞

C#设计模式之我见(四)Ⅱ C#设计模式之我见(四)Ⅰ C#设计模式之我见(三)Ⅱ C#设计模式之我见(三)Ⅰ C#设计模式之我见(二)Ⅱ C#设计模式之我见(二)Ⅰ C#设计模式之我见(一) 面向对象编程之重用、继承、多态、抽象 初探SilverLight 2.0的安装和部署 工作小札,生活一杯羹! “管家婆”的好帮手——我的理财小管家 类库DLL属性说明和正确使用App_Code中类的静态成员 冬日糊辣汤 以前的面试题(二) 以前的面试题 SQL Server 2005新特性之感悟 招聘高级网页设计师(北京) 知识点滴(打油篇) Web Services 的设计和模式
C#设计模式之我见(三)Ⅲ
李明飞 · 2011-07-13 · via 博客园 - 李明飞

今天接着讲上一节的创建性模式中的享元模式(Flyweight Pattern)、代理模式(Proxy Pattern)。

先介绍一下享元模式(Flyweight Pattern)的定义和在什么情况下使用。
使用情况:在对象数量比较多时,导致运行代价提高时才使用;
定义:针对对象数量多,运用共享技术有效的支持大量细粒度对象。
下面来分析一下
设计模式一书中的享元模式的实例:

namespace Flyweight.DesignPattern
{
      using System;
      using System.Collections;

      class FlyweightFactory 
          {
               private ArrayList pool = new ArrayList();
               public FlyweightFactory()
                  {
                      pool.Add(new ConcreteEvenFlyweight());  
                      pool.Add(new ConcreteUnevenFlyweight());   
                  }

              public Flyweight GetFlyweight(int key)                          //返回ArrayList中的数组值
                 {
                     int i = key % 2;
                     return((Flyweight)pool[i]); 
                }
         }

    abstract class Flyweight                                                             //声明享元抽象类
        {
            abstract public void DoOperation(int extrinsicState);      //声明抽象方法
        }

    class UnsharedConcreteFlyweight : Flyweight                         //定义Flyweight派生类
       {
           override public void DoOperation(int extrinsicState)       //覆写DoOperation方法
               {
   
               }
       }

    class ConcreteEvenFlyweight : Flyweight                                //定义Flyweight派生类
        {
            override public void DoOperation(int extrinsicState)      //覆写父类中的方法,并实例化
                 {
                       Console.WriteLine("In ConcreteEvenFlyweight.DoOperation: {0}", extrinsicState);      
                 }
         }

    class ConcreteUnevenFlyweight : Flyweight                             //定义Flyweight派生类
        {
            override public void DoOperation(int extrinsicState)       //覆写父类中的方法实例化
                 {
                      Console.WriteLine("In ConcreteUnevenFlyweight.DoOperation: {0}", extrinsicState);   
                 } 
        }

    public class Client
    {
        public static int Main(string[] args)
        {
            int[] data = {1,2,3,4,5,6,7,8};
            FlyweightFactory f = new FlyweightFactory();        //声明享元工厂对象
            int extrinsicState = 3;
            foreach (int i in data)                                                 //遍历data数组
               {
                    Flyweight flyweight = f.GetFlyweight(i);          //将处理过的值赋给flyweight对象
                    flyweight.DoOperation(extrinsicState);           //调用DoOperation方法
               }
               return 0;
        }
    }
}

接下来了解一下代理模式(Proxy Pattern)的定义和在什么情况下使用。
定义:代理(Proxy)通常包含和将要使用的对象同样的方法,一旦开始使用这个对象,这些方法将通过代理(Proxy)传递给实际的对象。
使用情况:一个对象,比如一幅很大的图像,需要载入的时间很长,
需要很长时间才可以完成的计算结果,并且需要在它计算过程中显示中间结果。这是一个需要载入和显示一幅很大的图像的程序,当程序启动时,就必须确定要显示的图像,但是实际的图像只能在完全载入后才可以显示!这时我们就可以使用代理模式(Proxy)。

阅读全文