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

推荐订阅源

WordPress大学
WordPress大学
T
Threat Research - Cisco Blogs
美团技术团队
IT之家
IT之家
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
Engineering at Meta
Engineering at Meta
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MongoDB | Blog
MongoDB | Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
Last Week in AI
Last Week in AI
M
MIT News - Artificial intelligence
G
Google Developers Blog
博客园 - 三生石上(FineUI控件)
Vercel News
Vercel News
The Register - Security
The Register - Security
Cyberwarzone
Cyberwarzone
F
Fortinet All Blogs
L
LINUX DO - 热门话题
C
Check Point Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Know Your Adversary
Know Your Adversary
S
Security Affairs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Webroot Blog
Webroot Blog
V2EX - 技术
V2EX - 技术
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Martin Fowler
Martin Fowler
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
I
InfoQ
Cisco Talos Blog
Cisco Talos Blog
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
T
The Exploit Database - CXSecurity.com
博客园 - 【当耐特】
C
CERT Recently Published Vulnerability Notes
酷 壳 – CoolShell
酷 壳 – CoolShell
云风的 BLOG
云风的 BLOG
L
Lohrmann on Cybersecurity
T
Threatpost
腾讯CDC
Security Latest
Security Latest
K
Kaspersky official blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Stack Overflow Blog
Stack Overflow Blog
Help Net Security
Help Net Security
Forbes - Security
Forbes - Security

博客园 - 李明飞

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)。

阅读全文