老生常谈:代理模式

      在上一篇你会在C#的类库中添加web service吗? 我谈到了web service的应用,本人一直学习设计模式,而web service就是代理模式的一种特别经典的应用。
  

      名词解释:
            代理:代理服务器,即Proxy服务器,在互联网上的完成跑腿服务。当你在浏览器中设置了某个Proxy服务器之后,由你的浏览器所发出的任何要求,都会被送到Proxy服务器上去,由这台Proxy服务器代为处理。
     

      现实中真实例子:

           在工厂和销售商之间也是这种类似的代理关系,工厂所生产的产品要想销售出去,首先必须要有客户,但是工厂是不希望这样的直接客户直接到工厂来买产品,原因可想而之,我这里列了几项:
       

        第一:工厂并没有那么多时间去接待数量众多的客户。
        第二:工厂并不一定具有一个非常出色销售团队。


       这样工厂就非常希望找到一个代理,来帮工厂完成销售任务。工厂把产品交给代理,代理负责打广告,销售,售后服务等等。在电脑城中,当我们diy电脑的时候,商家会到不同的硬件代理商那边去拿相关的配件,例如inter的cpu,电脑城中有很多商家做为intel的代理,他们都卖intel的cpu.代理商负责销售cpu, 发放质保卡等。在某种程度上来说,代理就代表了intel(部分权利)。
   

       代理商和工厂之间有一个共同的特点:他们都拥有intel的cpu,他们之间的利润成正比。说的抽象点就是他们之间具备共同的接口。客户可以和代理商沟通,特殊情况下可以直接和工厂沟通,例如,代理商找不到了,产品坏了,此时要修,这时就要直接访问工厂了。说的抽象点就是客户端可以通过代理来访问真实的类,也可以通过代理直接访问真实类。
   

       这样就非常清晰的显示出代理模式的结构元素:


       1:抽象角色:代理和真实类共同接口。
       2:真实角色:代理角色所代表的真实对象 .
       3:  代理角色:它的内部含真实角色的引用。它可以访问真实角色中的任何公有方法。

       代理模式的类图:

 

      

 

          代理模式的作用:
           在某些情况下,客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。例如在web application中添加web service,此时就会生成一个代理,这个代理负责访问远程服务,生成真实代理对象借助客户端调用。

            web service生成代码如下:Settings.Designer.cs,从中可以看出它完成了连接远程服务的功能,至于详细的原理本人不才,望各位指点。

 

// ------------------------------------------------------------------------------
//  <auto-generated>
//      此代码由工具生成。
//      运行库版本:2.0.50727.1433
//
//      对此文件的更改可能会导致不正确的行为,并且如果
//      重新生成代码,这些更改将会丢失。
//  </auto-generated>
// ------------------------------------------------------------------------------

namespace  MyWebService.Web.Properties {
    
    
    [
global ::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
    [
global ::System.CodeDom.Compiler.GeneratedCodeAttribute( " Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator " " 9.0.0.0 " )]
    
internal   sealed   partial   class  Settings :  global ::System.Configuration.ApplicationSettingsBase {
        
        
private   static  Settings defaultInstance  =  ((Settings)( global ::System.Configuration.ApplicationSettingsBase.Synchronized( new  Settings())));
        
        
public   static  Settings Default {
            
get  {
                
return  defaultInstance;
            }
        }
        
        [
global ::System.Configuration.ApplicationScopedSettingAttribute()]
        [
global ::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [
global ::System.Configuration.SpecialSettingAttribute( global ::System.Configuration.SpecialSetting.WebServiceUrl)]
        [
global ::System.Configuration.DefaultSettingValueAttribute( " http://localhost/MyWebService.Ws/Service1.asmx " )]
        
public   string  MyWebService_Web_localhost_Service1 {
            
get  {
                
return  (( string )( this [ " MyWebService_Web_localhost_Service1 " ]));
            }
        }
    }
}

 


       代理模式在众多模式中都非常眼熟,在adapter中也有引用对象的存在,在Decorator中也有引用对象.它们的共同特点都是一个类包含另一个类的引用,可以通过它访问被引用对象所有公有方法。但是它们之间又存在不同点:无论是adaoter模式还是decoraor模式,它们存在“引用”类之间都不必拥有共同的接口,它们之间可以是完成不相关的对象。


      1:代理模式中的代理对象和真实对象之间,无论访问谁,最终访问的是同一对象,即真实对象,它们之间并没有发生质的变化。
      2 :adapter模式中存在的引用,是在一个类中,引用另一个类中的方法,使其方法签名发生变化。是外表变了,本质没变。
      3:decorator中存在的引用,是在旧类的基础了增加新的功能。

注:
   本文引用:
http://www.cnblogs.com/zhenyulu/articles/48128.html

 

    

单例模式懒汉线程安全的实现可以通过在getInstance方法上加锁来实现。在懒汉式的单例模式中,单例对象的初始化是延迟到第一次调用getInstance方法时才进行的。为了确保线程安全,一种常见的做法是在getInstance方法上加上synchronized关键字,使得每次只有一个线程可以进入该方法。这样可以避免多个线程同时创建实例的问题。以下是一个懒汉线程安全的单例模式示例代码: ```java public class Singleton { private static Singleton instance; private Singleton() { // 私有化构造方法,防止外部直接实例化 } public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 在上述示例代码中,getInstance方法被声明为synchronized,确保了线程安全,但也会导致效率较低,因为每次调用getInstance方法时都需要获取锁。因此,在实际开发中,如果不是特别需要懒加载的特性,可以考虑使用饿汉式单例模式或者双重检查锁定单例模式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [单例模式之懒汉式(线程安全)](https://blog.csdn.net/qq_44119625/article/details/123523408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [老生常谈C++的单例模式与线程安全单例模式(懒汉/饿汉)](https://download.csdn.net/download/weixin_38741966/13783415)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值