关闭

大话设计模式-代理模式

标签: ios-进阶
78人阅读 评论(0) 收藏 举报
分类:

代理模式

问题:
    要实现根据用户权限实现订单操作
什么是代理模式:
    控制用户权限。
如何实现 
    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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:40105次
    • 积分:1410
    • 等级:
    • 排名:千里之外
    • 原创:75篇
    • 转载:46篇
    • 译文:18篇
    • 评论:2条
    最新评论