大话设计模式-代理模式

原创 2016年08月28日 14:57:53

代理模式

问题:
    要实现根据用户权限实现订单操作
什么是代理模式:
    控制用户权限。
如何实现 
    proxy代理类实现与具体类有的共同抽象方法,
    引入具体类的引用,说的有点抽象,理论是实践的基础,我们举一个具体的例子。

实际问题

我们要实现创建订单的人可以修改订单属性,就此问题利用代理实现

我们定义orderApi 接口,里面有三个属性 ,proudctName 
接口中声明这三个属性的setter and getter,
不过setter 需要多传递user 变量,此形参主要是为了在代理实现具体权限的控制

具体代码定义订单api

@interface OrderApi : NSObject

-(NSString*)getProductName;

-(void)setProductNameWith:(NSString*)productName
                 user:(NSString*)user;


-(NSString*)getOrderNum;

/**
     *  设置订单数量以及操作人员
     *
     *  @param orderNum 获取订单数量
     *  @param user     操作人员
    */
-(void)setOrderNumWith:(NSString*)orderNum
                  user:(NSString*)user;

/**
 *  return 获取创建订单的人员
 */
-(NSString*)getOrderUser;
/**
 *  设置创建订单人员
 *
 *  @param orderUser 创建订单的人员
 *  @param user      操作人员
 */
-(void)setOrderUserWith:(NSString*) orderUser
                   user:(NSString*) user;


@end

```

具体的order 具体类

#import "OrderApi.h"

@interface Order : OrderApi
+(instancetype)createOderWith:(NSString*)productName
                    orderUser:(NSString*)orderUser
                     orderNum:(NSString*)orderNum;

@end

.m文件

#import "Order.h"

@interface Order()

@property(nonatomic, strong)NSString* productName;
@property(nonatomic, strong)NSString* orderUser;
@property(nonatomic, strong)NSString* orderNum;

@end


@implementation Order

+(instancetype)createOderWith:(NSString*)productName
                    orderUser:(NSString*)orderUser
                     orderNum:(NSString*)orderNum

{
    Order * order = [[Order alloc] init];
    order.productName = productName;
    order.orderUser = orderUser;
    order.orderNum = orderNum;
    return order;
}

-(NSString*)getProductName
{
    return _productName;
}

-(void)setProductNameWith:(NSString *)productName user:(NSString *)user
{
    self.productName = productName;
}


-(NSString*)getOrderNum
{
    return _orderNum;
}


-(void)setOrderNumWith:(NSString *)orderNum user:(NSString *)user
{
    self.orderNum = orderNum;
}


-(NSString*)getOrderUser
{
    return _orderUser;
}


-(void)setOrderUserWith:(NSString *)orderUser user:(NSString *)user
{
    self.orderUser = orderUser;
}

注意这里property 会生成setter 和getter 是不行的 setter 需要额外传递 user 形参,property系统生成的还是不够

最重要的是看代理是怎么实现的

proxy.h

#import "OrderApi.h"
#import "Order.h"

@interface OrderProxy : OrderApi

@property (nonatomic, strong)Order* currentOrder;

+(instancetype)createOrderProxyWith:(Order*)order;

-(void)toString;
@end


#import "OrderProxy.h"
#import "Order.h"


@interface OrderProxy()

@end

@implementation OrderProxy

+(instancetype)createOrderProxyWith:(Order*)order
{
    OrderProxy * orderProxy = [[OrderProxy alloc] init];

    orderProxy.currentOrder = order;

    return orderProxy;
}

-(void)setProductNameWith:(NSString *)productName user:(NSString *)user
{
    //控制访问权限 只有创建订单的人员才能够修改
    if (user!= nil&&[user isEqualToString:[self getOrderUser]]) {
        [self.currentOrder setProductNameWith:productName user:user];
    }
}


-(NSString *)getProductName
{
    return [self.currentOrder getProductName];
}

-(void)setOrderNumWith:(NSString *)orderNum user:(NSString *)user
{
    //控制访问权限 只有创建订单的人员才能够修改
    if (user!= nil&&[user isEqualToString:[self getOrderUser]]) {
        [self.currentOrder setOrderNumWith:orderNum user:user];
    }
}

-(NSString *)getOrderNum{
    return [self.currentOrder getOrderNum];
}

-(void)setOrderUserWith:(NSString *)orderUser user:(NSString *)user
{
    //控制访问权限 只有创建订单的人员才能够修改
    if (user!= nil&&[user isEqualToString:[self getOrderUser]]) {
        [self.currentOrder setOrderUserWith:orderUser user:user];
    }
}

-(NSString *)getOrderUser
{
    return [self.currentOrder getOrderUser];
}

-(void)toString
{
    NSLog(@"productName%@-orderNum%@-orderUser%@",[self getProductName],[self getOrderNum], [self getOrderUser]);
}

我们看控制器里面具体调用

    //代理模式  何为代理 本质:控制对象的访问权限

//张三登录系统创建了一个订单
OrderApi* order = [OrderProxy createOrderProxyWith:[Order createOderWith:@"设计模式" orderUser:@"张三" orderNum:@"100"]];

//李四想要修改
[order setOrderNumWith:@"123" user:@"李四"];

//输出order
NSLog(@"李四修改后没有变化");
[order toString];

//张三修改就不会有问题
[order setOrderNumWith:@"123" user:@"张三"];
NSLog(@"张三修改后记录");
[order toString];

结果

2016-08-28 14:23:49.350 01-代理模式[12847:129242] 李四修改后没有变化
2016-08-28 14:23:49.351 01-代理模式[12847:129242] productName设计模式-orderNum100-orderUser张三
2016-08-28 14:23:49.351 01-代理模式[12847:129242] 张三修改后记录
2016-08-28 14:23:49.351 01-代理模式[12847:129242] productName设计模式-orderNum123-orderUser张三

不知道大家对本文所讲解是否有深刻体会了呢当然本文只是代理模式的初步入门,深入学习请等后续的文章,请试着多练习几遍,理解体会

demo下载链接 :
http://download.csdn.net/detail/sz457763638/9615102

大话设计模式之代理模式

  • 2012年02月03日 14:30
  • 74KB
  • 下载

大话设计模式--代理模式C++版

  • 2012年02月16日 07:37
  • 72KB
  • 下载

《大话设计模式》读书笔记之C++实现--chapter7代理模式

代理模式 2、UML类图详解 --Subject类:定义了RealSubject和Proxy的代理接口(也就是请求request函数的接口) --RealSubject类:定义了代理索要代理的真实实体...
  • wingWC
  • wingWC
  • 2017年04月01日 14:23
  • 259

大话设计模式--代理模式 proxy

1. 代理模式: 为其他对象提供一种代理以控制这个对象的访问。 代理模式使用场合: a. 远程代理, 为一个对象在不同的地址空间提供局部代理,隐藏一个对象存在于不同地址空间的事实。如.net中Web...

大话设计模式七:代理模式(proxy)

代理持有被代理对象的引用,代理对象调用持有被代理对象的引用来调用被代理对象的方法,其中,代理对象和被代理对象要实现共同接口。 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 //代理接口 ...
  • zdp072
  • zdp072
  • 2013年09月09日 22:25
  • 982

大话设计模式—代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。我们创建具有现有对象的对象,以便向外界提供功能接口。大话设计模式中程杰老师的给出的解释是代理模式...
  • lmb55
  • lmb55
  • 2016年03月19日 18:35
  • 889

大话设计模式,让你的代码更完美3---代理模式

代理模式,让你代理张三给女神送鲜花,最终女神跟你走! 首先创建一个送礼物的接口: //送礼物 interface GiveGift { void GiveDoll...

第7章 为别人做嫁衣----代理模式 大话设计模式

第7章 为别人做嫁衣----代理模式 7.1为别人做嫁衣 “小菜,今天见这个叫娇娇的美女见得如何呀?”大鸟一回家来就问小菜。 “唉,别提了,人家是有男朋友的。”小菜无精打采地答道。 “有男朋友...

<四>读<<大话设计模式>>之代理模式

代理模式我想大家即便不熟悉也都听过吧,从字面意思上看就是替别人干活的,比如代理商。在项目的实际应用中也有很多地方用到,比如spring通过代理模式生成对象等。 代理模式的书面定义:为其他对象提供一种...

java设计模式大话之代理模式

《山炮进城》大哥,也许你对你现在的处境感到困惑吧,把握机遇 掌控人生 ,今天的失败就是你明天的成功。蓝天计划,会让你一夜暴富,成为第二个马云,第二个李嘉诚。...
  • vsddvsd
  • vsddvsd
  • 2017年01月20日 16:48
  • 215
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大话设计模式-代理模式
举报原因:
原因补充:

(最多只允许输入30个字)