代理模式

作者: 架构师的一小步 | 来源:发表于2019-03-24 16:40 被阅读0次
代理模式定义

为其他对象那个提供一种,控制对这个对象的访问

代理模式角色划分

\color{red}{3个核心角色}
角色一:代理对象
两个特点
特点一:持有目标对象引用
特点二:实现目标接口(可选)
角色二:目标接口
角色三:具体目标对象
种类(变种):动态代理(Java语言)、静态代理
3、代理模式-原理案例?
2017年9月13日,苹果发布了iPhoneX,行货比较贵,港货比便宜1000,我需要别人(朋友)去帮我代购。
代理对象:我们的朋友->Proxy

//
//  Proxy.swift
//  Dream_20180727_Delegate
//
//  Created by Dream on 2018/7/27.
//  Copyright © 2018年 Tz. All rights reserved.
//

import UIKit

//代理对象
//两个特点
//特点一:持有目标对象引用
//特点二:实现目标接口(可选)
class Proxy: PersonProtocol {

    private var person:PersonProtocol
    
    init(person:PersonProtocol) {
        self.person = person
    }
    
    func buyProduct() {
        //统计
        self.person.buyProduct()
    }
    
    func payProduct() {
        self.person.payProduct()
    }
    
}

目标接口:我们想法,我们具体操作,一个业务场景->IPerson

//
//  IPerson.swift
//  Dream_20180727_Delegate
//
//  Created by Dream on 2018/7/27.
//  Copyright © 2018年 Tz. All rights reserved.
//

import Foundation

//目标接口:我们想法,我们具体操作,一个业务场景->PersonProtocol
protocol PersonProtocol {
    //下单(选购)
    func buyProduct()
    //付款(支付)
    func payProduct()
}

具体目标:我->NSLogPerson

//
//  NSLogPerson.swift
//  Dream_20180727_Delegate
//
//  Created by Dream on 2018/7/27.
//  Copyright © 2018年 Tz. All rights reserved.
//

import UIKit

//具体目标:我->NSLogPerson
class NSLogPerson: PersonProtocol {

    func buyProduct() {
        print("选购iPhoneX")
    }
    
    func payProduct() {
        print("正在支付...")
    }
    
}

代理模式-加强理解?

场景:服务器开发,数据库表子段非常多,一张表80多个子段?
查询时候并不需要那么多子段,只需要20个足以,其他子段用到了我再去加载(查询)
业务场景,如何设计?->代理模式(不同场景不同代理对象,为了保证对原始业务以及模块不受影响,通常情况下选择代理)?
模拟:订单数据?
案例二:代理模式实现优化?
角色一:目标接口->OrderProtocol

//
//  OrderProtocol.swift
//  Dream_20180727_Delegate
//
//  Created by Dream on 2018/7/27.
//  Copyright © 2018年 Tz. All rights reserved.
//

import Foundation

//角色一:目标接口->OrderProtocol
protocol OrderProtocol {

    func getOrderId() -> String
    func setOrderId(orderId:String)
    
    func getOrderName() -> String
    func setOrderName(orderName:String)
    
    func getOrderPrice() -> String
    func setOrderPrice(orderPrice:String)
    
    func getOrderUserName() -> String?
    func setOrderUserName(orderUserName:String?)
    
}

        角色二:目标对象->OrderBean
//
//  OrderBean3.swift
//  Dream_20180727_Delegate
//
//  Created by Dream on 2018/7/27.
//  Copyright © 2018年 Tz. All rights reserved.
//

import UIKit

//角色二:目标对象->OrderBean(模型)
//没毛病(保证整体结构OK的)
class OrderBean3: OrderProtocol {

    var orderId:String
    var orderName:String
    var orderPrice:String
    var orderUserName:String?
    
    init(orderId:String, orderName:String, orderPrice:String, orderUserName:String?) {
        self.orderId = orderId
        self.orderName = orderName
        self.orderPrice = orderPrice
        self.orderUserName = orderUserName
    }
    
    func getOrderId() -> String {
        return self.orderId
    }
    func setOrderId(orderId:String){
        self.orderId = orderId
    }
    
    func getOrderName() -> String{
        return self.orderName
    }
    func setOrderName(orderName:String){
        self.orderName = orderName
    }
    
    func getOrderPrice() -> String {
        return self.orderPrice
    }
    func setOrderPrice(orderPrice:String){
        self.orderPrice = orderPrice
    }
    
    func getOrderUserName() -> String? {
        return self.orderUserName
    }
    func setOrderUserName(orderUserName:String?){
        self.orderUserName = orderUserName
    }
    
    //业务逻辑
    
}

        角色三:代理对象->OrderBeanProxy
//
//  OrderBeanProxy.swift
//  Dream_20180727_Delegate
//
//  Created by Dream on 2018/7/27.
//  Copyright © 2018年 Tz. All rights reserved.
//

import UIKit

//角色三:代理对象->OrderBeanProxy(保护代理->保护原有的对象)
//两个特点
//特点一:持有目标对象引用
//特点二:实现目标接口(可选)
class OrderBeanProxy: OrderProtocol {
    
    //order->实际上就是OrderBean3引用
    private var order:OrderProtocol
    
    init(order:OrderProtocol) {
        self.order = order
    }

    func getOrderId() -> String {
        return self.order.getOrderId()
    }
    func setOrderId(orderId:String){
        self.order.setOrderId(orderId: orderId)
    }
    
    func getOrderName() -> String{
        return self.order.getOrderName()
    }
    func setOrderName(orderName:String){
        self.order.setOrderName(orderName: orderName)
    }
    
    func getOrderPrice() -> String {
        return self.order.getOrderPrice()
    }
    func setOrderPrice(orderPrice:String){
        self.order.setOrderPrice(orderPrice: orderPrice)
    }
    
    func getOrderUserName() -> String? {
        return self.loadOrderUserName()
    }
    func setOrderUserName(orderUserName:String?) {
        self.order.setOrderUserName(orderUserName: orderUserName)
    }
    
    //扩展业务方法
    private func loadOrderUserName() -> String? {
        if self.order.getOrderUserName() == nil {
            //查询
            let service = OrderService3.shared
            //准备SQL
            let select = service.orders.select(service.orderUserName).where(service.orderId == self.order.getOrderId())
            //执行SQL
            for row in try! service.db.prepare(select){
                //根据子段获取对应的值
                return row[service.orderUserName]
            }
        }
        return self.order.getOrderUserName()
    }
    
}

//
//  OrderService.swift
//  Dream_20180727_Delegate
//
//  Created by Dream on 2018/7/27.
//  Copyright © 2018年 Tz. All rights reserved.
//

import UIKit

class OrderService3 {

    private var utils:DBUtils
    var db:Connection
    var orders:Table
    var orderId:Expression<String>
    var orderName:Expression<String>
    var orderPrice:Expression<String>
    var orderUserName:Expression<String>
    
    //单利对象
    private static var _shared = OrderService3()
    
    static var shared:OrderService3{
        return _shared
    }
    
    
    private init() {
        self.utils = DBUtils()
        self.db = utils.getConnection()
        self.orders = Table("orders")
        
        self.orderId = Expression<String>("orderId")
        self.orderName = Expression<String>("orderName")
        self.orderPrice = Expression<String>("orderPrice")
        self.orderUserName = Expression<String>("orderUserName")
        
        try! self.db.run(self.orders.create { t in
            t.column(self.orderId)
            t.column(self.orderName)
            t.column(self.orderPrice)
            t.column(self.orderUserName)
        })
        
        //自定义运算符(后面学习的)->框架学了,功力大增1-2倍
        let data1 = self.orders.insert(self.orderId <- "1", self.orderName <- "NBA", self.orderPrice <- "100", self.orderUserName <- "Hello")
        //保存数据
        try! self.db.run(data1)
        let data2 = self.orders.insert(self.orderId <- "2", self.orderName <- "NBA", self.orderPrice <- "100", self.orderUserName <- "Hello")
        try! self.db.run(data2)
        let data3 = self.orders.insert(self.orderId <- "3", self.orderName <- "NBA", self.orderPrice <- "100", self.orderUserName <- "Hello")
        try! self.db.run(data3)
    }
    
    func getOrderList() -> Array<OrderProtocol> {
        var array = Array<OrderProtocol>()
        //查询数据
        for order in try! self.db.prepare(self.orders.select(orderId, orderName, orderPrice)) {
            print("orderId: \(order[orderId])")
            print("orderName: \(order[orderName])")
            print("orderPrice: \(order[orderPrice])")
            
            let orderBean = OrderBean3(orderId: order[orderId], orderName: order[orderName], orderPrice: order[orderPrice], orderUserName: nil)
            //父类引用指向子类实例对象
            let proxy = OrderBeanProxy(order: orderBean)
            array.append(proxy)
        }
        return array
    }
}

调用

        let service = OrderService3.shared
        //案例二我们使用的是具体对象->直接使用OrderBean
        let array = service.getOrderList()
        for order in array {
            print("orderId: \(order.getOrderId())")
            print("orderName: \(order.getOrderName())")
            print("orderPrice: \(order.getOrderPrice())")
        }
        print("orderId: \(array[0].getOrderUserName())")

        10个变种->静态代理(场景:保护代理(设计访问权限)、虚代理)
    动态代理…
    对比一下在开发中,你用代理,分析角色,养成习惯

相关文章

  • 设计模式

    单例模式 模板方法模式 工厂模式 代理模式 静态代理 JDK动态代理

  • 设计模式

    单例模式 代理模式 静态代理 jdk动态代理 cglib动态代理 工厂模式 适配器模式 建造者模式 观察者模式

  • kube-proxy的3种模式

    userspace代理模式 iptables代理模式 IPVS代理模式 https://kubernetes.io...

  • 第4章 结构型模式-代理模式

    一、代理模式简介 二、代理模式3个角色 三、代理模式的优点 四、代理模式的实例(游戏代练)

  • 理解代理模式

    原创博客地址 简介 代理模式,也叫做委托模式,分为:静态代理动态代理 代理模式也是平时比较常用的设计模式之一,代理...

  • 结构型 代理模式(文末有项目连接)

    1:什么是代理模式 2:没用代理模式时的实例 3:使用代理模式将其解耦(静态代理) 3:使用代理模式将其解耦(动态...

  • 设计模式-动态代理模式

    之前介绍了代理模式,大家也都了解了代理模式,不过之前介绍的代理模式是静态代理,静态代理什么意思?静态代理指的是代理...

  • 代理模式

    一、什么是代理模式 代理模式(Proxy pattern):代理模式又叫委托模式,是为某个对象提供一个代理对象,并...

  • 设计模式之代理模式(Proxy模式)

    代理模式的引入 代理模式的实例程序 代理模式的分析 代理模式的引入 Proxy是代理人的意思,指的是代替别人进行工...

  • Java设计模式之代理模式

    Java设计模式之代理模式 代理模式 静态代理 动态代理 为什么需要代理 通过代理,我们能够不用知道委托人是谁,而...

网友评论

    本文标题:代理模式

    本文链接:https://www.haomeiwen.com/subject/ufduvqtx.html