大话设计模式-代理模式

原创 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

大话设计模式C++实现-第7章-代理模式

一、UML图 二、概念 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 三、应用场景 (1)远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间...
  • XD_lixin
  • XD_lixin
  • 2014年12月16日 22:58
  • 1375

大话设计模式 读书笔记

大话设计模式 读书笔记 着重从c#代码角度分析 学习心得: 学设计模式,不需要是否能立刻理解和记忆,无需着力首先是UML图 再从设计模式到UML图 从UML图到代码 其次知道各种模式的应用场景即可...
  • jiangdmdr
  • jiangdmdr
  • 2017年03月01日 18:50
  • 375

大话设计模式[中文PDF+源代码]

下载地址:http://feixueteam.net/thread-493-1-1.html
  • u013948190
  • u013948190
  • 2016年01月05日 17:13
  • 7519

《大话设计模式》读后感

第一次读《大话设计模式》,是在刚接触C#的时候。疲累于大部头的官方教材中时,无意间翻开了这本生动有趣的书,甚是眼前一亮。由于当时C#基础薄弱,只是把它当小说来看,如饥似渴,饶有滋味,一口气看到凌晨四点...
  • u013798619
  • u013798619
  • 2014年12月22日 05:49
  • 2319

《大话设计模式》读书笔记,附Java代码实现

花了不到一周时间读完了《大话设计模式》,并用Java实现了一遍,需要继续实战项目才能深刻理解设计模式。 代码托管在设计模式Java代码简要实现 策略模式:它定义了算法家族,分别封装起来,让它们...
  • doleria
  • doleria
  • 2017年05月21日 23:53
  • 2424

读《大话设计模式》和《head first 设计模式》心得

1.面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。 2.如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责...
  • fuqiaoyimeng
  • fuqiaoyimeng
  • 2013年11月10日 18:17
  • 1251

Java程序员从笨鸟到菜鸟之(三十二)大话设计模式(二)设计模式分类和三种工厂模式

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188       设计模式分类 首先先简单说一下设计模式的分类设计模式可以分为三大类,...
  • csh624366188
  • csh624366188
  • 2012年04月15日 09:02
  • 13462

大话设计模式—工厂模式

一、简介工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类: 简单工厂模式(Simple Factory) 工厂方法模式(Factory Method) 抽象工厂模...
  • lmb55
  • lmb55
  • 2015年05月31日 14:42
  • 1149

《大话设计模式》电子档pdf下载地址

提醒:因文件过大,超过限制范围,所以拆分成了两部分,下载下来后可合并成一个文件上部:http://download.csdn.net/detail/ws_flying/9881735 下部:http...
  • ws_flying
  • ws_flying
  • 2017年07月10日 19:20
  • 472

《大话设计模式》26种设计模式Java代码整理(全)

26种设计模式大全(含java代码) /**  * 适配器模式  * 在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。  * 一个适配允许通常...
  • wangyan199366
  • wangyan199366
  • 2017年02月03日 15:22
  • 4097
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大话设计模式-代理模式
举报原因:
原因补充:

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