设计模式-结构型模式:代理模式 Proxy
2016-12-12 17:29
901 查看
代理模式:在真实类不方便修改、管理不了它等情况下,可以通过代理对它进行维护
代理模式不是为了增加行为,而是为了控制行为
架构设计思想:任何问题,都可以通过添加一层来解决
先来一个简单的代理模式例子,下面代码中,有一个Mid类和它的代理类MidProxy
Ihero接口
Mid
MidProxy
调用
结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/29/2a13ca108222edb758bbe7311be45889)
通过上面,还可能不能太好的理解代理类,其实代理类在我的理解中,就是当你对一个类不能进行直接的修改的时候,通过一个第三方,可以给他进行更多的约束控制,或者添加一些其他功能,比如下面说一下 单例代理,以上面代码为例,如果我的Mid已经不能进行修改了,但是我还想让他实现单例,就按照下面的方法来做
对MidProxy进行修改
调用的时候。多new几次
看看结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/29/23a8b72b424a67ca350607da5f2cbfdd)
这就实现了,在不修改Mid的情况下实现了单例效果
代理模式不是为了增加行为,而是为了控制行为
架构设计思想:任何问题,都可以通过添加一层来解决
先来一个简单的代理模式例子,下面代码中,有一个Mid类和它的代理类MidProxy
Ihero接口
public interface IHero { void ClickQ(); void ClickW(); void ClickE(); void ClickR(); }
Mid
public class Mid:IHero { public Mid() { Console.WriteLine("实例化了一次"); } public void ClickQ() { Console.WriteLine("释放了一个Q技能"); } public void ClickW() { Console.WriteLine("释放了一个W技能"); } public void ClickE() { Console.WriteLine("释放了一个E技能"); } public void ClickR() { Console.WriteLine("释放了一个R技能"); } }
MidProxy
public class MidProxy:IHero { private static Mid _mid = new Mid(); public void ClickQ() { _mid.ClickQ(); } public void ClickW() { _mid.ClickW(); } public void ClickE() { _mid.ClickE(); } public void ClickR() { _mid.ClickR(); } }
调用
IHero hero = new MidProxy(); hero.ClickQ(); hero.ClickW(); hero.ClickE(); hero.ClickR();
结果:
通过上面,还可能不能太好的理解代理类,其实代理类在我的理解中,就是当你对一个类不能进行直接的修改的时候,通过一个第三方,可以给他进行更多的约束控制,或者添加一些其他功能,比如下面说一下 单例代理,以上面代码为例,如果我的Mid已经不能进行修改了,但是我还想让他实现单例,就按照下面的方法来做
对MidProxy进行修改
public class MidProxy:IHero { private static Mid _mid =null; private static object _lock = new object(); public MidProxy() { if (_mid == null) { lock (_lock) { if (_mid == null) { _mid = new Mid(); } } } } public void ClickQ() { _mid.ClickQ(); } public void ClickW() { _mid.ClickW(); } public void ClickE() { _mid.ClickE(); } public void ClickR() { _mid.ClickR(); } }
调用的时候。多new几次
IHero hero1 = new MidProxy(); IHero hero2 = new MidProxy(); IHero hero = new MidProxy(); hero.ClickQ(); hero.ClickW(); hero.ClickE(); hero.ClickR();
看看结果:
这就实现了,在不修改Mid的情况下实现了单例效果
相关文章推荐
- java实现一个抽奖概率类
- HTML语言标签之超链接
- APP逆向分析之钉钉抢红包插件的实现-iOS篇
- 使用MD5对用户密码加密与解密
- a标签的简单用法
- C# 获取汉字拼音首字母
- [置顶] Android省市区三级联动的实现
- sdut 2116—数据结构实验之链表一:顺序建立链表
- 仿淘宝分页按钮效果简单美观易使用的JS分页控件
- ListView 还没有setAdapter时候,headerView不显示?
- nyoj 图像有用区域(BFS)
- nyoj 图像有用区域(BFS)
- nyoj 图像有用区域(BFS)
- nyoj 图像有用区域(BFS)
- nyoj 图像有用区域(BFS)
- nyoj 图像有用区域(BFS)
- nyoj 图像有用区域(BFS)
- nyoj 图像有用区域(BFS)
- Android签署应用
- Android应用程序资源的编译和打包过程分析