而被通报的目的称为观察者,3个客户不想依然无法间接引用3个指标

情势动机
图片 1
在少数情形下,1个客户不想仍旧不能一贯引用1个指标,此时得以经过三个叫做“代理”的别人来兑现直接引用。代理对象足以在客户端和目的对象时期起到中介的效劳,并且能够经过代理对象去掉客户不能够看出的剧情和服务只怕加上客户必要的附加服务。
图片 2
图片 3
经过引入多个新的靶子(如小图片和远程代理对象)来落到实处对实事求是对象的操作依旧将新的靶子作为忠实对象的八个就义品,这种落成机制即为代理情势,通过引入代理对象来直接待上访问贰个指标,那便是代理方式的形式动机。

方式动机
图片 4 图片 5
确立一种对象与对象时期的注重关系,三个目的发生变更时将活动布告其余对象,其余对象将相应做出反应。在此,发生转移的对象称为观看对象,而被布告的指标称为观看者,3个考察对象能够对应七个观看者,而且这么些观望者之间没有互相调换,能够依照须求充实和删除观看者,使得系统更便于扩大,那就是观看者情势的方式动机。

情势动机
图片 6 图片 7
树立一种对象与对象期间的重视关系,多少个指标产生转移时将机关文告别的对象,其余对象将相应做出反应。在此,产生变更的对象称为观望对象,而被文告的指标称为观望者,一个观望对象能够对应三个观察者,而且这几个观察者之间一直不互动关联,能够遵照供给增删观看者,使得系统更易于扩充,那正是观察者形式的格局动机。

格局定义
代办格局(Proxy Pattern)
:给某一个目的提供二个代理,并由代理对象说了算对原对象的引用。代理格局的英文名叫Proxy或Surrogate,它是一种对象结构型方式。
Proxy Pattern: Provide a surrogate or placeholder for another object to
control access to it.
Frequency of use: medium high
UML图
图片 8

格局定义
旁观者形式(Observer
Pattern):定义对象间的一种一对多信赖关系,使得每当3个对象情形爆发改变时,其有关注重对象皆获得公告并被自动更新。观望者形式又称之为揭橥-订阅(Publish/Subscribe)情势、模型-视图(Model/View)格局、源-监听器(Source/Listener)方式或从属者(Dependents)格局。观望者形式是一种对象行为型方式。
Observer Pattern: Define a one-to-many dependency between objects so
that when one object changes state, all its dependents are notified and
updated automatically.
Frequency of use: high
UML图
图片 9

方式定义
阅览者形式(Observer
Pattern):定义对象间的一种一对多重视关系,使得每当一个指标境况爆发改变时,其相关注重对象皆获得关照并被自动更新。观察者方式又称作宣布-订阅(Publish/Subscribe)情势、模型-视图(Model/View)模式、源-监听器(Source/Listener)格局或从属者(Dependents)情势。观看者情势是一种对象行为型模式。
Observer Pattern: Define a one-to-many dependency between objects so
that when one object changes state, all its dependents are notified and
updated automatically.
Frequency of use: high
UML图
图片 10

方式结构
代办情势涵盖如下剧中人物:
 Subject: 抽象主旨剧中人物
 Proxy: 代理宗旨剧中人物
 RealSubject: 真实焦点剧中人物

形式结构
观看者形式涵盖如下角色:
Subject: 目标
ConcreteSubject: 具体对象
Observer: 观察者
ConcreteObserver: 具体观看者

形式组织
旁观者情势涵盖如下剧中人物:
Subject: 目标
ConcreteSubject: 具体目的
Observer: 观察者
ConcreteObserver: 具体观察者

格局分析
代办方式表示结构图相比简单,一般能够简化为如下图所示,但是在实际中要复杂很多。
图片 11

格局分析
观看者形式描述了怎么建立指标与目的之间的借助关系,如何协会知足那种须求的种类。
这一形式中的关键目的是观望对象和观察者,四个目的能够有专擅数目标与之相重视的观察者,一旦指标的境况产生变更,全体的观看者都将取得布告。
作为对这一个公告的响应,每种阅览者都将即时更新自身的情状,以与对象状态同步,那种彼此也称之为发布-订阅(publish-subscribe)。目的是通报的公布者,它发生公告时并不必要知道什么人是它的观望者,能够有私自数指标观望者订阅它并吸收公告。

形式分析
观看者格局描述了怎样树立指标与目标之间的信赖性关系,如何协会餍足这种需求的体系。
这一格局中的关键指标是阅览对象和阅览者,二个指标可以有自由数指标与之相正视的观看者,一旦指标的情况爆发转移,全部的观看者都将取得通知。
作为对这么些布告的响应,每一种观察者都将即时更新本身的景况,以与对象状态同步,那种互相也称为发布-订阅(publish-subscribe)。指标是通报的宣布者,它爆发通报时并不须要知道哪个人是它的观看者,能够有自由数指标观看者订阅它并采用公告。

方式实例与分析
系统布局
图片 12
Subject: 抽象宗旨剧中人物 IGiveGift.cs

格局实例与分析
老总娘回来?作者不明白!—观看者形式示例代码
系统布局
图片 13
Subject: 目标 ISubject.cs

形式实例与分析
主管娘回来?我不精通!—观望者方式示例代码
系统布局
图片 14
Subject: 目标 ISubject.cs

namespace ProxyPattern
{
    interface IGiveGift
    {
        void GiveDolls();
        void GiveFlowers();
        void GiveChocalate();
    }
}
namespace ObserverPattern
{
    interface ISubject
    {
        void Attach(Observer observer);
        void Detach(Observer observer);
        void Notify();
        string SubjectState
        {
            get;
            set;
        }
    }
}
namespace ObserverPattern
{
    interface ISubject
    {
        void Attach(Observer observer);
        void Detach(Observer observer);
        void Notify();
        string SubjectState
        {
            get;
            set;
        }
    }
}

Proxy: 代理主旨剧中人物 Proxy.cs

ConcreteSubject: 具体对象 Secretary.cs

ConcreteSubject: 具体对象 Secretary.cs

namespace ProxyPattern
{
    class Proxy : IGiveGift
    {
        Pursuit gg;
        public Proxy(SchoolGirl mm)
        {
            gg = new Pursuit(mm);
        }
        public void GiveDolls()
        {
            gg.GiveDolls();
        }
        public void GiveFlowers()
        {
            gg.GiveFlowers();
        }
        public void GiveChocalate()
        {
            gg.GiveChocalate();
        }
    }
}
using System.Collections.Generic;

namespace ObserverPattern
{
    //前台秘书类
    class Secretary : ISubject
    {
        //同事列表
        private IList<Observer> observers = new List<Observer>();
        private string action;
        //增加
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }
        //减少
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }
        //通知
        public void Notify()
        {
            foreach (Observer o in observers)
            {
                o.Update();
            }
        }
        //前台状态
        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }
    }
}
using System.Collections.Generic;

namespace ObserverPattern
{
    //前台秘书类
    class Secretary : ISubject
    {
        //同事列表
        private IList<Observer> observers = new List<Observer>();
        private string action;
        //增加
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }
        //减少
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }
        //通知
        public void Notify()
        {
            foreach (Observer o in observers)
            {
                o.Update();
            }
        }
        //前台状态
        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }
    }
}

RealSubject: 真实宗旨剧中人物 Pursuit.cs

Boss.cs

Boss.cs

using System;

namespace ProxyPattern
{
    class Pursuit : IGiveGift
    {
        SchoolGirl mm;
        public Pursuit(SchoolGirl mm)
        {
            this.mm = mm;
        }
        public void GiveDolls()
        {
            Console.WriteLine(mm.Name + " 送你洋娃娃");
        }
        public void GiveFlowers()
        {
            Console.WriteLine(mm.Name + " 送你鲜花");
        }
        public void GiveChocalate()
        {
            Console.WriteLine(mm.Name + " 送你巧克力");
        }
    }
}
using System.Collections.Generic;

namespace ObserverPattern
{
    class Boss : ISubject
    {
        //同事列表
        private IList<Observer> observers = new List<Observer>();
        private string action;
        //增加
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }
        //减少
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }
        //通知
        public void Notify()
        {
            foreach (Observer o in observers)
            {
                o.Update();
            }
        }
        //前台状态
        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }
    }
}
using System.Collections.Generic;

namespace ObserverPattern
{
    class Boss : ISubject
    {
        //同事列表
        private IList<Observer> observers = new List<Observer>();
        private string action;
        //增加
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }
        //减少
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }
        //通知
        public void Notify()
        {
            foreach (Observer o in observers)
            {
                o.Update();
            }
        }
        //前台状态
        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }
    }
}

SchoolGirl.cs

Observer: 观察者 Observer.cs

Observer: 观察者 Observer.cs

namespace ProxyPattern
{
    class SchoolGirl
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
}
namespace ObserverPattern
{
    abstract class Observer
    {
        protected string name;
        protected ISubject sub;
        public Observer(string name, ISubject sub)
        {
            this.name = name;
            this.sub = sub;
        }
        public abstract void Update();
    }
}
namespace ObserverPattern
{
    abstract class Observer
    {
        protected string name;
        protected ISubject sub;
        public Observer(string name, ISubject sub)
        {
            this.name = name;
            this.sub = sub;
        }
        public abstract void Update();
    }
}

Client:客户类

ConcreteObserver: 具体观看者 StockObserver.cs

ConcreteObserver: 具体观望者 StockObserver.cs

using System;

namespace ProxyPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            SchoolGirl schoolGirl = new SchoolGirl();
            schoolGirl.Name = "貂蝉";

            Proxy proxy = new Proxy(schoolGirl);
            proxy.GiveDolls();
            proxy.GiveFlowers();
            proxy.GiveChocalate();

            Console.Read();
        }
    }
}
using System;

namespace ObserverPattern
{
    //看股票的同事
    class StockObserver : Observer
    {
        public StockObserver(string name, ISubject sub)
            : base(name, sub)
        {
        }
        public override void Update()
        {
            Console.WriteLine("{0} {1} 关闭股票行情,继续工作!", sub.SubjectState, name);
        }
    }
}
using System;

namespace ObserverPattern
{
    //看股票的同事
    class StockObserver : Observer
    {
        public StockObserver(string name, ISubject sub)
            : base(name, sub)
        {
        }
        public override void Update()
        {
            Console.WriteLine("{0} {1} 关闭股票行情,继续工作!", sub.SubjectState, name);
        }
    }
}

方式优缺点
代理方式的亮点
 代理情势能够协调调用者和被调用者,在早晚水准上跌落了系统的耦合度。

远程代理使得客户端能够访问在长途机器上的对象,远程机器大概具备更好的计量品质与处理速度,能够长足响应并处理客户端请求。

虚拟代理通过选取二个小指标来表示三个大目的,能够减掉系统能源的消耗,对系统实行优化并进步运营速度。
 爱抚代理能够操纵对真正对象的运用权限。
代理形式的缺点

由于在客户端和实事求是宗旨之间扩充了代理对象,由此有些类其余代办形式恐怕会招致请求的处理速度变慢。
 实现代理方式要求万分的做事,有个别代理形式的贯彻卓殊复杂。

NBAObserver.cs

NBAObserver.cs

方式适用条件
听别人说代理方式的选拔目标,常见的代办情势有以下几类别型:

远程(Remote)代理:为叁个放在差别的地址空间的指标提供一个地面包车型大巴代办对象,那几个差异的地方空间能够是在同样台主机中,也然则在另一台主机中,远程代理又叫做大使(Ambassador)。

虚拟(Virtual)代理:假设急需创立贰个财富消耗较大的对象,先创制2个消耗相对较小的指标来代表,真实对象只在供给时才会被真正创造。

Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正必要时才实施。一般的话,对象的深克隆是3个支付较大的操作,Copy-on-Write代理能够让那么些操作延迟,唯有对象被用到的时候才被克隆。
 爱惜(Protect or
Access)代理:控制对叁个对象的拜访,能够给不相同的用户提供分裂级别的施用权限。

缓冲(Cache)代理:为某一个指标操作的结果提供近期的囤积空间,以便多个客户端能够共享这么些结果。
 防火墙(Firewall)代理:爱惜目标不让恶意用户接近。

同步化(Synchronization)代理:使多少个用户能够同时采取三个指标而没有冲突。
 智能引用(斯马特Reference)代理:当三个目的被引用时,提供部分附加的操作,如将此指标被调用的次数记录下来等。

using System;

namespace ObserverPattern
{
    class NBAObserver : Observer
    {
        public NBAObserver(string name, ISubject sub)
            : base(name, sub)
        {
        }
        public override void Update()
        {
            Console.WriteLine("{0} {1} 关闭NBA直播,继续工作!", sub.SubjectState, name);
        }
    }
}
using System;

namespace ObserverPattern
{
    class NBAObserver : Observer
    {
        public NBAObserver(string name, ISubject sub)
            : base(name, sub)
        {
        }
        public override void Update()
        {
            Console.WriteLine("{0} {1} 关闭NBA直播,继续工作!", sub.SubjectState, name);
        }
    }
}

【表明与谢谢】
正文,站在不少大个子的双肩上,借鉴和引用了众多客人拥有版权的文章或撰文,在此,对前人们的孝敬致谢。并还要发表引用的内容、原来的书文者或缘于(一些来源互连网的剧情作者不能追述本源,深表遗憾)。

Client:客户类

Client:客户类

【参考文献】
《设计方式—可复用面向对象软件的基础》小编: [美] Erich Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—革新既有代码的陈设》作者: 马丁 Fowler译者:候捷
中华夏族民共和国电力出版社
《敏捷软件开发—原则、方式与实践》作者: 罗Bert C. 马丁 南开东军事和政院学出版社
《程序员修炼之道—从小工到学者》小编: Andrew Hunt / 大卫 Thomas电子工业出版社
《Head First 设计情势》小编: Freeman 译者: O’Reilly Taiwan集团中华夏族民共和国电力出版社
《设计形式之禅》 笔者: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计方式纵横谈》 助教:李建忠
刘伟(Liu-Wei). 设计形式. 新加坡:北大东军事和政治大学学出版社, 二零一一.
Liu Wei. 设计情势实训教程. 新加坡:武大东军事和政院学出版社, 2013.
《大话设计方式》 我: 程杰 清华东军政大学学出版社
《C#图解教程》小编: 索Liss 译者: 苏林 / 朱晔 人民邮政和邮电通信出版社
《你不能够不明白的.NET》作者: 王涛
《项目中的.NET》笔者: 李天平 电子工业出版社
《Microsoft .NET公司级应用框架结构设计》笔者: (美)埃斯波西托等撰写 译者:
陈黎夫
http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
http://www.cnblogs.com/zhenyulu 博客小编:吕震宇
http://www.cnblogs.com/terrylee 博客小编:李会军
http://www.cnblogs.com/anlyren/ 博客作者:anlyren
http://www.cnblogs.com/idior 博客小编:idior
http://www.cnblogs.com/allenlooplee 博客小编:Allen lee
http://blog.csdn.net/ai92 博客小编:ai92
http://www.cnblogs.com/umlonline/ 博客我:张传波
http://www.cnblogs.com/lovecherry/ 博客小编:LoveCherry

using System;

namespace ObserverPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            Secretary secretary = new Secretary();
            StockObserver stockObserver1 = new StockObserver("张三", secretary);
            NBAObserver stockObserver2 = new NBAObserver("李四", secretary);
            //前台记下了两位同事
            secretary.Attach(stockObserver1);
            secretary.Attach(stockObserver2);
            //发现老板回来
            secretary.SubjectState = "老板回来了";
            //通知两个同事
            secretary.Notify();
            Console.Read();
        }
    }
}
using System;

namespace ObserverPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            Secretary secretary = new Secretary();
            StockObserver stockObserver1 = new StockObserver("张三", secretary);
            NBAObserver stockObserver2 = new NBAObserver("李四", secretary);
            //前台记下了两位同事
            secretary.Attach(stockObserver1);
            secretary.Attach(stockObserver2);
            //发现老板回来
            secretary.SubjectState = "老板回来了";
            //通知两个同事
            secretary.Notify();
            Console.Read();
        }
    }
}

形式优缺点
观看者形式的优点

观望者模式能够兑现表示层和数据逻辑层的诀别,并定义了安澜的音讯更新传递机制,抽象了履新接口,使得能够有足够多彩分化的表示层作为具体旁观者剧中人物。
 观察者情势在考察对象和观望者之间建立一个浮泛的耦合。
 观看者方式协理广播通讯。
 观看者方式符合“开闭原则”的渴求。

格局优缺点
观看者方式的亮点

阅览者形式能够兑现表示层和数码逻辑层的诀别,并定义了平稳的新闻更新传递机制,抽象了履新接口,使得可以有各类各种差别的表示层作为具体观察者剧中人物。
 观望者格局在观望对象和观望者之间建立一个虚幻的耦合。
 阅览者情势帮忙广播通讯。
 观看者方式符合“开闭原则”的要求。

观看者情势的欠缺

借使1个着眼对象对象有这一个直接和直接的观望者的话,将兼具的观看者都通报加入开销很多时间。

假如在观察者和着眼对象以内有轮回正视的话,阅览对象会触发它们中间开始展览巡回调用,大概导致系统崩溃。

观望者情势尚未对号入座的机制让旁观者知道所观望标对象对象是怎么爆发变化的,而仅仅只是知道旁观对象发出了变更。

观看者情势的瑕疵

若是3个观望对象对象有很多一贯和直接的观望者的话,将持有的观望者都通报加入成本很多光阴。

若是在观看者和观测对象之内有轮回注重的话,观望对象会接触它们中间开始展览巡回调用,恐怕导致系统崩溃。

观察者形式尚未相应的建制让观望者知道所寓指标指标对象是怎么产生变化的,而仅仅只是知道旁观对象发出了变更。

情势适用条件
在以下意况下能够运用观望者方式:

一个华而不实模型有七个方面,在那之中3个方面重视于另1个方面。将这一个地点封装在独立的指标中使它们得以分级独立地改成和复用。

1个对象的改变将导致其余多少个或多少个目的也发生变更,而不精通具体有个别许对象将时有发生转移,可以下落对象之间的耦合度。
 一个目的必须通报任何对象,而并不知道那一个目的是什么人。

供给在系统中开创2个触发链,A对象的一言一行将震慑B对象,B对象的一言一行将影响C对象……,能够动用阅览者方式开创一种链式触发机制。

格局适用条件
在偏下情形下可以运用阅览者方式:

二个浮泛模型有多个方面,当中二个地方依赖于另三个地方。将这么些方面封装在单独的对象中使它们得以独家独立地转移和复用。

3个对象的改变将招致别的一个或几个指标也发出变动,而不知情具体有多少对象将发出转移,可以下跌对象期间的耦合度。
 三个指标必须通报任何对象,而并不知道这么些指标是何人。

要求在系统中创立1个触发链,A对象的表现将影响B对象,B对象的一颦一笑将影响C对象……,能够选取观察者情势创建一种链式触发机制。

【申明与谢谢】
正文,站在多如牛毛壮汉的肩膀上,借鉴和引用了不少别人拥有版权的创作或撰文,在此,对前人们的孝敬致谢。并同时揭橥引用的内容、最初的著作者或出自(一些来自互连网的剧情本人无法追述本源,深表遗憾)。

【申明与感激】
正文,站在诸多高个子的肩头上,借鉴和引用了累累旁人拥有版权的创作或撰文,在此,对前人们的贡献致谢。并同时发布引用的始末、原著者或出自(一些源点网络的内容本人不可能追述本源,深表遗憾)。

【参考文献】
《设计格局—可复用面向对象软件的基本功》笔者: [美] 埃里克h Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—改革既有代码的计划性》小编: 马丁 Fowler译者:候捷
中华夏族民共和国电力出版社
《敏捷软件开发—原则、格局与实践》小编: 罗Bert C. 马丁 浙大东军事和政治大学学出版社
《程序员修炼之道—从小工到大家》小编: 安德鲁 Hunt / 大卫 Thomas电子工业出版社
《Head First 设计情势》我: Freeman 译者: O’Reilly Taiwan公司中中原人民共和国电力出版社
《设计情势之禅》 小编: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计情势纵横谈》 助教:李建忠
Liu Wei. 设计情势. 法国首都:武大东军政高校学出版社, 二〇一一.
Liu Wei. 设计方式实验和培养和练习教程. 东京:复旦东军大学出版社, 二零一一.
《大话设计情势》 笔者: 程杰 交大东军事和政院学出版社
《C#图解教程》小编: 索Liss 译者: 苏林 / 朱晔 人民邮政和邮电通讯出版社
《你必须清楚的.NET》小编: 王涛
《项目中的.NET》小编: 李天平 电子工业出版社
《Microsoft .NET公司级应用架构划设想计》小编: (美)埃斯波西托等撰写 译者:
陈黎夫
http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
http://www.cnblogs.com/zhenyulu 博客我:吕震宇
http://www.cnblogs.com/terrylee 博客小编:李会军
http://www.cnblogs.com/anlyren/ 博客小编:anlyren
http://www.cnblogs.com/idior 博客小编:idior
http://www.cnblogs.com/allenlooplee 博客作者:Allen lee
http://blog.csdn.net/ai92 博客笔者:ai92
http://www.cnblogs.com/umlonline/ 博客小编:张传波
http://www.cnblogs.com/lovecherry/ 博客我:LoveCherry

【参考文献】
《设计方式—可复用面向对象软件的根底》作者: [美] 埃里克h Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—更始既有代码的规划》小编: 马丁 Fowler译者:候捷
中华人民共和国电力出版社
《敏捷软件开发—原则、方式与履行》小编: 罗Bert C. Martin 武大东军大学出版社
《程序员修炼之道—从小工到大方》小编: Andrew Hunt / 大卫 托马斯电子工业出版社
《Head First 设计情势》笔者: Freeman 译者: O’Reilly Taiwan集团中夏族民共和国电力出版社
《设计格局之禅》 小编: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计格局纵横谈》 教授:李建忠
刘伟(Liu-Wei). 设计格局. 香江:南开东军事和政院学出版社, 二〇一一.
刘伟同志. 设计格局实验和培养和陶冶教程. 法国首都:浙大东军事和政院学出版社, 贰零壹叁.
《大话设计格局》 小编: 程杰 交大东军事和政院学出版社
《C#图解教程》小编: 索Liss 译者: 苏林 / 朱晔 人民邮政和电信出版社
《你必须了然的.NET》小编: 王涛
《项目中的.NET》作者: 李天平 电子工业出版社
《Microsoft .NET公司级应用架构划设想计》笔者: (美)埃斯波西托等撰写 译者:
陈黎夫
http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
http://www.cnblogs.com/zhenyulu 博客笔者:吕震宇
http://www.cnblogs.com/terrylee 博客小编:李会军
http://www.cnblogs.com/anlyren/ 博客笔者:anlyren
http://www.cnblogs.com/idior 博客小编:idior
http://www.cnblogs.com/allenlooplee 博客小编:Allen lee
http://blog.csdn.net/ai92 博客笔者:ai92
http://www.cnblogs.com/umlonline/ 博客小编:张传波
http://www.cnblogs.com/lovecherry/ 博客我:LoveCherry

相关文章