精华内容
下载资源
问答
  • 关于人际网络的强弱关系的一个简单应用。关于图书馆的管理!
  • 设计模式构建模式的Java实现版本,包括UML类设计
  • 利用J2EE模式构建网站

    2021-03-05 01:47:19
    一、前言 本文以一个教学网站的建设思路为例,探讨利用J2EE技术和WebSphere产品构建网站的模式和方法。二、设计网站系统 我们的样例是一个教学网站系统,它的软件包括WebSphereApplicationServer应用服务器软件V...
  • 基于数据库的食品安全知识图谱构建方法和展示模式.doc
  • 构建类型(type diagrams)的三个视角(perspective) : 概念模型 人类思考世界的方式 纯脑中印象(mental picture),忽略任何技术细节 概念模型的两种变化 表示世界的结构 : represent the read world 表示我们...

    构建类型图(type diagrams)的三个视角(perspective) :

    • 概念模型

      • 人类思考世界的方式
      • 纯脑中印象(mental picture),忽略任何技术细节
      • 概念模型的两种变化
        • 表示世界的结构 : represent the read world
        • 表示我们知道什么 : represent what we know about the world
    • 规范模型

      • 定义系统中软件组件的接口
      • 可以是显式的(explicit)或者隐式的(implicit)
        • 隐式的规范模型更接近概念模型
        • 概念模型和隐式的规范模型通常几乎相同
      • 显式模型的例子 : C++ 头文件
      • 隐式模型通常结合某些惯例(convention),这些惯例说明了如何将隐式变成显式
        • 举例 : 比如一个隐式模型上有 birthdate 属性
          • Smalltalk中会有 birthdate 和 birthdate:aDate 两个方法
          • C++中会有 getBirthdate() 和 void setBirthdate(Date) 两个方法
    • 实现模型

      • 仅仅存在于class内部
      • 更准确地讲,实现模型叫做类图
      • 一般不应该被类的客户使用
    • 位置

      • 书目 分析模式 – 可复用的对象模型 Martin Fowler 人民邮电出版社
      • 页码 : P314
    展开全文
  • 构建模式

    2020-02-01 23:29:10
    什么是构建模式 将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示 隐藏了复杂对象的创建过程,把他复杂对象的创建过程加以抽象,通过子类继承或重载 UML 共享单车为例子的代码 转...
    • 最近尝试性地在牛客上笔试了一下,感觉除了上课所学的设计模式以外,公司笔试还会有要求掌握其他虽然不常用但是重要的设计模式

    什么是构建者模式

    • 将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
    • 隐藏了复杂对象的创建过程,把他复杂对象的创建过程加以抽象,通过子类继承或重载

    UML图

    在这里插入图片描述

    共享单车为例子的代码

    • 转自:https://www.jianshu.com/p/3d1c9ffb0a28
    • 原始单车对象(product):
    
    public class Bike { 
    
        private IFrame frame; 
        private ISeat seat; 
        private ITire tire; 
        
        public IFrame getFrame() { 
            return frame; 
        } 
        public void setFrame(IFrame frame) { 
            this.frame = frame; 
        } 
        public ISeat getSeat() { 
            return seat; 
        } 
        public void setSeat(ISeat seat) { 
            this.seat = seat; 
        } 
        public ITire getTire() { 
            return tire; 
        } 
        public void setTire(ITire tire) { 
            this.tire = tire; 
        } 
    } 
    
    • 单车构建者对象(builder)
    // 抽象 builder 类 
    public abstract class Builder { 
        abstract void buildFrame(); 
        abstract void buildSeat(); 
        abstract void buildTire(); 
        abstract Bike createBike(); 
    } 
    
    • 实体构建者摩拜,ofo(concreteBuilder)
    // 具体 builder 类 
    public class MobikeBuilder extends Builder{ 
        private Bike mBike = new Bike(); 
        @Override 
        void buildFrame() { 
            mBike.setFrame(new AlloyFrame()); 
        } 
        @Override 
        void buildSeat() { 
            mBike.setSeat(new DermisSeat()); 
        } 
        @Override 
        void buildTire() { 
            mBike.setTire(new SolidTire()); 
        } 
        @Override 
        Bike createBike() { 
            return mBike; 
        } 
    } 
    
    public class OfoBuilder extends Builder{ 
        private Bike mBike = new Bike(); 
        @Override 
        void buildFrame() { 
            mBike.setFrame(new CarbonFrame()); 
        } 
        @Override 
        void buildSeat() { 
            mBike.setSeat(new RubberSeat()); 
        } 
        @Override 
        void buildTire() { 
            mBike.setTire(new InflateTire()); 
        } 
        @Override 
        Bike createBike() { 
            return mBike; 
        } 
    } 
    
    • 指挥者类(director)
    public class Director { 
        private Builder mBuilder = null; 
        public Director(Builder builder) { 
            mBuilder = builder; 
        } 
        public Bike construct() { 
            mBuilder.buildFrame(); 
            mBuilder.buildSeat(); 
            mBuilder.buildTire(); 
            return mBuilder.createBike(); 
        } 
    }
    
    • 客户端使用
    public class Click { 
        public static void main(String[] args) { 
            showBike(new OfoBuilder()); 
            showBike(new MobikeBuilder()); 
        } 
        private void showBike(Builder builder) {
            Director director = new Director(builder); 
            Bike bike = director.construct(); 
            bike.getFrame().frame(); 
            bike.getSeat().seat(); 
            bike.getTire().tire(); 
        } 
    } 
    

    优缺点

    优点

    • 实例建造者之间是相互独立的(摩拜和ofo),有利于系统的扩展
    • 构建者模式可以使得客户端不必知道产品内部的细节,如摩拜里面单车的车轮选择什么品牌
    • 构建者之间相互独立,使得可以对建造过程逐渐细化,而不对其他模块产生影响

    缺点

    • 如果产品之间差异性太大,则不适合使用建造者模式
    • 如果产品内部变化复杂,则需要定义许多具体的建造者来实现这种变化,导致系统庞大
    展开全文
  • phobos::castle:风格化,异步处理的《我的世界》世界编辑原理生成器,提供了在处理发生在另一个线程上时,通过效果和模式构建原理的绝妙方法。
  • 本节书摘来自异步社区《Photoshop...构建参考图像Photoshop混合模式深度剖析实现色彩混合或是其他效果的方法有很多,很多人更习惯于处理真实的照片,但我更喜欢通过抽象的示意来解决问题。因此,我需要建立示例文...

    本节书摘来自异步社区《Photoshop混合模式深度剖析》一书中的第2章构建参考图像,作者【美】Scott Valentine,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    构建参考图像
    Photoshop混合模式深度剖析
    实现色彩混合或是其他效果的方法有很多,很多人更习惯于处理真实的照片,但我更喜欢通过抽象的示意图来解决问题。因此,我需要建立示例文件,并调整各种参数以实现预期的效果,这样就不会受到真实照片中复杂色彩的干扰。使用这种方法的关键是,注意操作和根据色彩及其他调整而生成的结果之间的关系。尽管可以设计许多其他文件和方案,但最好的测试方法通常是处理自己想要调整的图像。将参考文件放在触手可及之处,或者是在灵感来临时构建参考文件,这是更好地处理具体图像的一种方式。

    为了进行全局色比较,我创建了RGB三角形,可以在混合模式描述中看到它们。每个通道上的灰色条组都旋转了120度,这样每个通道都有与其他通道相同的表示,以及“纯粹”的颜色。三角形中的每个点只有在一个通道中才是白色的,然后演变为另一侧的黑色渐变。结果是三角形的重心表示50%灰,而从该点向四周移动会显示其他颜色混合。在边缘仅混合了两种颜色,这是相关点之间的两种颜色(参见图2.15)。


    screenshow?key=1506c6733a4402a3efe7

    图2.15 此三角形表示单个通道的灰度值。其他通道具有相同的三角形,但进行了旋转以表示RGB颜色的范围。白色表示100%颜色,而黑色表示0%颜色。

    注意
    本书中的图像都转换为CMYK以供印刷使用。原始参考文件是在RGB中构建的,RGB是图像处理专家常用的工作空间。实际上,所有混合模式都是为RGB工作空间创建的,这就是在Photoshop中处理CMYK图像时许多混合模式无法使用的原因。可以从我的网站(www.lightningsymphony.com)下载文件以查看RGB颜色的图像,屏幕上的图像与本书中的图像有明显的不同。
    为了比较混合模式,我在一个图层上放置了两个RGB三角形副本,并在此图层上方复制了该图层以保持定位(参见图2.16)。对其中一个三角形进行了反向操作,以展示如何将颜色与其自身颜色及其RGB对立颜色进行混合。大多数摄影师和数字艺术家通常使用RGB工作空间,因此首先展示此颜色模式。

    注意
    可以为CMYK工作空间建立相同的模型,但是Lab提出了一个独特的挑战,附录将介绍此挑战。混合模式描述显示了RGB和CMYK中具有完整色谱的两个正方形。
    应该对全色谱渐变的一种纯色进行另一次尝试。颜色条显示了堆叠顺序:渐变位于纯色上方,然后是纯色位于渐变上方。在许多情况下堆叠顺序非常重要,尤其是混合多个图层时。此示例中的每个通道都是单独构建的(参见图2.17)。


    screenshow?key=15064d94c508b38dab95

    图2.16 将三角形放在不同图层上,显示在同一图像(右侧)和反图像(左侧)上更改混合模式之后的效果。

    <a href=https://yqfile.alicdn.com/468e4a073acb9c2330b03accda0dea4a152fa066.png" >

    图2.17 纯色条之间的渐变是压缩的。

    也许这些示例文件最引人注目的是,此连续色谱图像在正方形中显示了同一渐变,复制图像并将其旋转90度。由于线性规则,此示例允许色谱中的每种颜色与其他颜色交互一次。显示器的有限性可能会让此类图像具有人为痕迹,但从数字角度看,渐变没有图案。如果将混合模式更改为差值,则会看到对角线为黑色,这是颜色相同的位置,因为任何值减去自身都是0,也就是说颜色是黑色的(参见图2.18)。


    screenshow?key=150680c50d2e50374347

    图2.18 旋转色谱副本可以让每种颜色与另一种颜色交互一次。注意,黑色线显示了颜色减去自身的位置。

    继续进行此色谱示例,可以在第3个图层上添加各种方向的原色条。这是一种很好的方式,可以调查将一种混合模式的输出作为另一种混合模式输入的结果。此示例还显示了用作半透明堆栈的图层无法使用混合模式。混合模式本身并不影响指定像素的不透明度,仅影响颜色的不透明度。因此,任意混合结果都是高级别混合的直接输入。调整混合图层的不透明度可以生成不同的效果,请自己尝试一下吧。最后,一个更具有针对性的示例是顺序。当您希望调整具体颜色和不透明度时应该使用此示例。这是一个构建起来非常简单的文件,但是对于谨慎地理解混合模式非常有用。底部图层是50%灰的图层,应用了色相/饱和度调整图层。选中“色相/饱和度”对话框中的“着色”按钮,可以将颜色和饱和度更改为RGB色谱中的任意值。这两个图层上方的图层使用纯色进行了填充,您希望混合该图层。在蒙版中添加从黑色到白色的线性渐变,这样可以在一角显示底部颜色,并在另一角显示完全不透明的混合颜色。

    混合结果在蒙版中添加两个颜色条:黑色和白色,以查看不透明颜色旁边的纯色基色和混合颜色。在所有颜色条上方,使用新图层创建一个混合颜色条。此新图层不会混合为颜色控制点,因此您可以了解混合颜色的变化程度(参见图2.19)。要使用此示例,使用所需的颜色填充混合和控制图层。然后,使用色相/饱和度调


    screenshow?key=150641923ebdb6164a26

    图2.19 一个参考文件,允许您轻松地选择任意纯色以研究具体颜色的混合模式。

    注意
    所有参考文件旨在帮助可视化各种混合模式组合。可以在我的网站(http://lightningsymphony.com/hpobm)下载这些参考文件,只要包含原作者和直接链接,就可以随意共享这些文件。请不要在您的网站上托管它们,复制它们或者以任意其他下载或媒介提供它们。
    整图层更改背景。当然,也可以轻松更改这些图层的堆叠顺序。


    screenshow?key=15062193423b2f24fc10

    本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
    展开全文
  • 一、构建模式  什么是构建模式?  将一个“复杂对象的构建算法”与它的“部件及组装方式”分离,使得构建算法和组装方式可以独立应对变化;复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用...

    一、构建者模式

           什么是构建者模式?

           将一个“复杂对象的构建算法”与它的“部件及组装方式”分离,使得构建算法和组装方式可以独立应对变化;复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式。

           比如,建造一栋大厦,那么就需要一个总建筑工程师(也就是指导者,相当于uml图中的组装者),N个包工头(也就是承包商,相当于uml图中的构建者),一个包工头有M个小工(也就是搬砖的、贴砖的、木工等等,相当于uml图中的生成者),指导者可以使用承包商A、承包商B、承包商C的自由组合,单个承包商又可以使用搬砖的、贴砖的、木工的自由组合,这样就把构建和组装分离开了。

           在创建者模式中,客户端不再负责对象的创建与组装,而是把这个对象创建的责任交给其具体的创建者类,把组装的责任交给组装类,客户端只负责对象的调用,从而明确了各个类的职责。虽然利用创建者模式可以创建出不同类型的产品,但是如果产品之间的差异巨大,则需要编写多个创建者类才能实现,如果这样结合工厂模式更好。

            代码示例:

    创建构建者协议类Builder

    #import <Foundation/Foundation.h>
    
    // 构建者
    @protocol Builder <NSObject>
    
    // 构建部分
    - (NSString *)builderPart;
    @end

    创建具体生成者类ConcreteBuild 
    ConcreteBuild.h

    #import <Foundation/Foundation.h>
    #import "Builder.h"
    
    @interface ConcreteBuild : NSObject <Builder>
    
    @end

    ConcreteBuild.m

    #import "ConcreteBuild.h"
    
    @implementation ConcreteBuild
    
    #pragma mark - Builder
    - (NSString *)builderPart {
        return @"实现协议, 返回产品";
    }
    @end

    创建组装者类Director

    Director.h

    #import <Foundation/Foundation.h>
    #import "Builder.h"
    
    @interface Director : NSObject
    
    // 创建传入的实现者
    - (instancetype)initWithBuilder:(id<Builder>)builder;
    
    // 建造
    - (NSString *)construct;
    @end

    Director.m

    #import "Director.h"
    
    @interface Director ()
    @property (nonatomic, copy) id<Builder> builder;
    @end
    
    @implementation Director
    - (instancetype)initWithBuilder:(id<Builder>)builder {
        self = [super init];
        if (self) {
            _builder = builder;
        }
        return self;
    }
    
    // 建造
    - (NSString *)construct {
        // 创建部件
        return [self.builder builderPart];
    }
    @end

    ViewController调用

    #import "ViewController.h"
    #import "Director.h"
    #import "ConcreteBuild.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        // 1.创建生成者, 知道要做的产品
        ConcreteBuild *build = [[ConcreteBuild alloc] init];
        NSString *str2 = [build builderPart];
    
        // 2.创建承包商
        Director *director = [[Director alloc] initWithBuilder:build];
    
        // 3.交付产品
        NSString *str = [director construct];
        NSLog(@"str = %@, str2 = %@",str, str2);
    
    }
    
    @end

            实际开发Demo

            生成者(工人)先实现DrawView,好比一开始生成具体小产品,构建者(包工头)再把这些小产品构建成具体大产品DrawBuilder,指导者Director(建筑总工程师)依据自己的需求去选择DrawSubBuilderOne(具体包工头)或者DrawSubBuilderTeo(具体包工头)进行组装。

    先创建生成者

    DrawView.h

    #import <UIKit/UIKit.h>
    
    @interface DrawView : UIView
    
    @property (nonatomic, assign) CGFloat buildLabel;
    @property (nonatomic, assign) CGFloat buildButton;
    @property (nonatomic, assign) CGFloat buildSizeView;
    
    @end

    DrawView.m

    #import "DrawView.h"
    
    @implementation DrawView
    
    - (instancetype)initWithFrame:(CGRect)frame {
        self = [super initWithFrame: frame];
        if (self) {
            self.backgroundColor = [UIColor grayColor];
        }
        return self;
    }
    
    // 使用drawRect,可以在控制器中设置值给view.
    - (void)drawRect:(CGRect)rect {
        
        [self setBackgroundColor:[UIColor redColor]];
        // label
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(self.buildLabel, 100, 50, 80)];
        label.text = @"TZ";
        label.textAlignment = NSTextAlignmentCenter;
        label.textColor = [UIColor blackColor];
        [self addSubview:label];
        
        // 按钮
        UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, self.buildButton, 100, 50)];
        [btn setTitle:@"蓝色" forState:UIControlStateNormal];
        btn.titleLabel.backgroundColor = [UIColor redColor];
        btn.titleLabel.textAlignment = NSTextAlignmentCenter;
        [self addSubview:btn];
        
        // 添加view
        UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(100, 200, 100, self.buildSizeView)];
        subView.backgroundColor = [UIColor blueColor];
        [self addSubview:subView];
        
        UIImage *backgroundImage = [UIImage imageNamed:@"tupian"];
        UIImageView *backgroundView = [[UIImageView alloc] initWithImage:backgroundImage];
        
        [self addSubview:backgroundView];
    }
    
    @end

    再创建构建者

    DrawBuilder.h

    #import <Foundation/Foundation.h>
    #import "DrawView.h"
    
    @interface DrawBuilder : NSObject
    
    - (CGFloat)buildLabel;  /**< 构建label */
    - (CGFloat)buildButton; /**< 构建按钮 */
    - (CGFloat)buildSizeView; /**< 构建蓝色的View */
    
    - (DrawView *)loadView; /**< 构建结果 */
    
    @end

    DrawBuilder.m

    #import "DrawBuilder.h"
    
    @implementation DrawBuilder
    - (CGFloat)buildLabel {
        return 0;
    }
    
    - (CGFloat)buildButton {
        return 0;
    }
    
    - (CGFloat)buildSizeView {
        return 0;
    }
    
    - (DrawView *)loadView {
        CGFloat drawWidth = 200;
        CGFloat drawHeight = 300;
    
        DrawView *drawView = [[DrawView alloc] initWithFrame:CGRectMake(0, 0, drawWidth, drawHeight)];
    
        //
        drawView.buildLabel = [self buildLabel];
        drawView.buildButton = [self buildButton];
        drawView.buildSizeView = [self buildSizeView];
        
        return drawView;
    }
    
    @end

    具体构建者都继承构建者DrawBuilder

    DrawSubBuilderOne.m

    #import "DrawSubBuilderOne.h"
    
    @implementation DrawSubBuilderOne
    - (CGFloat)buildLabel {
        return 1;
    }
    
    - (CGFloat)buildButton {
        return 1;
    }
    
    - (CGFloat)buildSizeView {
        return 1;
    }
    @end

    DrawSubBUilderTeo.m

    #import "DrawSubBuilderTeo.h"
    
    @implementation DrawSubBuilderTeo
    - (CGFloat)buildLabel {
        return 10;
    }
    
    - (CGFloat)buildButton {
        return 150;
    }
    
    - (CGFloat)buildSizeView {
        return 100;
    }
    @end

    组装者

    Director.h

    #import <Foundation/Foundation.h>
    #import "DrawBuilder.h"
    
    @interface Director : NSObject
    
    + (DrawView *)creatView:(DrawBuilder *)builder;
    
    @end

    Director.m

    #import "Director.h"
    
    @implementation Director
    
    + (DrawView *)creatView:(DrawBuilder *)builder {
        DrawView *drawView = [builder loadView];
        return drawView;
    }
    @end

    ViewController.m

    #import "ViewController.h"
    #import "DrawSubBuilderOne.h"
    #import "DrawSubBuilderTeo.h"
    #import "Director.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    - (IBAction)btnClick:(id)sender {
        // 创建者
    //    DrawBuilder *builder = [[DrawSubBuilderOne alloc] init];
        DrawBuilder *builder = [[DrawSubBuilderTeo alloc] init];
    
        // 组装
        DrawView *drawView = [Director creatView:builder];
        
        drawView.center = self.view.center;
        [self.view addSubview:drawView];
    }
    
    
    @end

    运行结果:

    二、中介者模式

    何为中介者模式?

           中介者模式是用一个对象来封装一组或者一系列对象的交互方式,使对象间的交互可以在一个中介者对象中处理,从而使各对象耦合松散,而且可以独立的改变它们之间的交互。中介者就好比站在十字路口的交通警察,如果改变十字路口的交通模式,只需要把新的交通策略给交通警察即可,而不是路上的所有车辆,这样才能更好的协调来自不同方向车辆。

    中介者模式有什么用?

           说到中介者模式的作用,其实从上述的定义中便可以知道其大体用处,无非是用来集中的管理一组对象的交互,从而降低各个对象间的耦合度。当一组对象彼此间的依赖程度较高,导致难以复用时,便可以采用该模式。大家对中介这种角色估计也不陌生,所以今天的设计模式就以这个房地产中介作为故事背景吧!

    1.png

            从无中介.jpg可以看出,要是没有中介的存在,买卖家之间的交流是如此困难且复杂。买家买房要跑去找卖家,卖家买房又得跑去找买家。如果现实真的如此,估计买卖家早就拍桌子说:“老子xx不买(卖)了!”如此反复,房地产业还可能像现在这样撑起国家经济吗?

    2.png

    好了,有中介的接入,一切都变得so easy了!买家要买房,直接到中介看房源,卖家卖房,直接委托中介推销,买卖家通过中介相互取得联系,进行沟通,最后达成买卖共识。呃..不瞎扯了,直接写个demo就清楚了!!!!

    如图,同事间通过中介者进行交互,中介者和同事都是抽象类,首先先创建这2个抽象类AbstrctColleague和AbstractMediator。

    AbstrctColleague.h

    #import <Foundation/Foundation.h>
    @class AbstrctColleague;
    
    @protocol ColleagueDelegate <NSObject>
    
    // 跟colleague对象的交互
    - (void)colleagueEvent:(AbstrctColleague *)event;
    
    @end
    
    @interface AbstrctColleague : NSObject
    @property (nonatomic, weak) id<ColleagueDelegate> delegate;
    @end
    

    AbstrctColleague.m

    #import "AbstrctColleague.h"
    
    @implementation AbstrctColleague
    
    @end
    

    AbstractMediator.h

    #import <Foundation/Foundation.h>
    #import "AbstrctColleague.h"
    
    @interface AbstractMediator : NSObject <ColleagueDelegate>
    
    @end

    AbstractMediator.m

    #import "AbstractMediator.h"
    
    @implementation AbstractMediator
    
    - (void)colleagueEvent:(AbstrctColleague *)event {
    
    }
    @end

    接着创建具体类Colleague和TypeOneMediator分别继承抽象类AbstrctColleague和AbstractMediator,并实现其方法。

    Colleague.h

    #import <UIKit/UIKit.h>
    #import "AbstrctColleague.h"
    
    @interface Colleague : AbstrctColleague
    @property (nonatomic, assign) CGFloat value;
    
    // 修改数值
    - (void)changeValue:(CGFloat)value;
    @end

    Colleague.m

    #import "Colleague.h"
    
    @implementation Colleague
    
    - (void)changeValue:(CGFloat)value {
        self.value = value;
        if (self.delegate && [self.delegate respondsToSelector:@selector(colleagueEvent:)]) {
            
            [self.delegate colleagueEvent:self];
        }
    }
    
    @end

    TypeOneMediator.h

    #import "AbstractMediator.h"
    #import "Colleague.h"
    
    @interface TypeOneMediator : AbstractMediator
    
    @property (nonatomic, strong) Colleague *colleagueA;
    @property (nonatomic, strong) Colleague *colleagueB;
    @property (nonatomic, strong) Colleague *colleagueC;
    
    
    // 查看信息
    - (NSDictionary *)values;
    
    @end

    TypeOneMediator.m

    #import "TypeOneMediator.h"
    
    @implementation TypeOneMediator
    
    // 主要用来查看打印信息.
    - (NSDictionary *)values {
        return @{@"A":@(self.colleagueA.value),
                 @"B":@(self.colleagueB.value),
                 @"C":@(self.colleagueC.value),
                 };
    }
    
    // 指定算法.
    - (void)colleagueEvent:(AbstrctColleague *)event {
        
        if ([event isEqual:self.colleagueA]) {
            self.colleagueB.value = self.colleagueA.value * 2;
            self.colleagueC.value = self.colleagueA.value * 4;
            
        } else if ([event isEqual:self.colleagueB]) {
            self.colleagueA.value = self.colleagueB.value / 2.f;
            self.colleagueC.value = self.colleagueB.value * 2.f;
            
        } else {
            self.colleagueA.value = self.colleagueC.value / 4.f;
            self.colleagueB.value = self.colleagueC.value / 2.f;
        }
    }
    
    @end

    最后,创建VC将中介者和多个同事给关联起来,中介者拥有多个同事对象,所有同事的代理对象设置为中介者。

    ViewController.m

    #import "ViewController.h"
    #import "TypeOneMediator.h"
    #import "Colleague.h"
    
    @interface ViewController ()
    @property (nonatomic, strong) TypeOneMediator *mediator;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        self.mediator = [TypeOneMediator new];
        
        Colleague *colleagueA = [Colleague new];
        Colleague *colleagueB = [Colleague new];
        Colleague *colleagueC = [Colleague new];
        
        self.mediator.colleagueA = colleagueA;
        self.mediator.colleagueB = colleagueB;
        self.mediator.colleagueC = colleagueC;
    
        colleagueA.delegate = self.mediator;
        colleagueB.delegate = self.mediator;
        colleagueC.delegate = self.mediator;
        
    //    [colleagueA changeValue:2.f];
    //    NSLog(@"%@", [self.mediator values]);
        
        [colleagueB changeValue:2.f];
        NSLog(@"%@", [self.mediator values]);
        
    }
    
    @end

    深层次的应用:

           在一些特殊情况下,打开不同的页面(VC)之后,还需要传递一些命令到这个VC,让其做一些特殊的操作,于是可以通过配置URL的参数,再通过参数名和参数值传递给新VC:

    [MRRouter openURL:@"scheme://test?aa=11&bb=22"];

    更方便的,可以直接用字典来传递参数

    [MRRouter openURL:@"scheme://test3" parameters:@{@"ccc":@"333",@"ddd":@"444"}];

    于是还需要创建一个映射表,来建立URL和VC之间的映射关系,每增加一个VC,就在这个表里头增加一个对应关系。这里可以利用Objective-C的Runtime来动态地根据类名去映射,简化我们的日常编码操作,具体的实现就不在这里详细描述了,有兴趣可以去这里看具体的实现。

    还可以定义一个默认的openURL操作:

    [MRRouter sharedInstance].defaultExecutingBlock = ^(id object, NSDictionary *parameters) { 
        [self.navigationController pushViewController:object animated:YES];
    };

    这样在一般情况下打开一个新的页面,不需要引入任何头文件,也不需要建立映射关系,只需要调用Router的openURL接口。

    通过以中介者模式为基础的Router管理页面的额外好处,就是可以简化服务端push需要打开新页面的操作,当有一个新的活动,要打开一个对应的页面,只需要把这个页面的URL通过push发送给客户端,客户端直接传递给Router即可,省略了大量的if/else的逻辑判断。

     

    展开全文
  • vazco/uniforms 一组用于从每个模式构建表单的 React 库。 API | 贡献 | 快速入门 | 游乐场 | 路线 包括什么? 自动生成表单 能够渲染每个模式的字段 帮助创建一行的自定义字段 内联和异步表单验证 与各种模式的...
  • 四种模式构建对象特点突出,可归结为对象创建模式 工厂模式(Factory) 定义 定义一个用于创建对象的接口,让子类决定实例化,实例化延迟。 通俗概括 通过多态特性,让用户利用子类创建对象,达到某方法里与...
  • 架构 节点说明 Ip 节点说明 端口 管控台地址 192.168.17.17 rabbitmq master 5672 http:// 192.168.17.17:15672 ...
  • DgraphQL:从架构构建GraphQL服务 介绍 Dgraph是一个分布式的,高度可用的图形数据库,它使用类似于GraphQL的语言来查询和变异数据。 与GraphQL不同,Dgraph仅为内的谓词(属性)定义架构。 没有复杂类型或属性组...
  • 构建者模式构建者模式 认识 思考 优缺点 使用场景 UML 代码实现 源码例子认识 构建者模式可以分步骤构建复杂对象,构建的过程是固定不变的director实现,变化的部分放到builder中实现,定义多个builder的实现类...
  • 首先看下AlertDialog解析 首先要会用AlertDialog的使用 new AlertDialog.Builder(this) .setIcon(R.mipmap.ic_launcher) .setTitle("消息") .setPositiveButton("确定", new DialogInterface....
  • 本节书摘来自华章出版社《大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一书中的第2章,第2.3节,南森·马茨(Nathan Marz) ...2.3 图模式 基于事实的模型中的每个事实都捕捉了一段信息。但事实本身不...
  • 在MongoDB University学习更多关于MongoDB的知识和技能到目前为止,在《利用模式进行构建》系列中,我们已经研究了多态模式、属性模式和桶模式。其中,尽管文档的模式略有不同,但从应用程序和查询的角度来看,文档...
  • 大学时期是通过阅读获取知识信息的重要人生阶段。...面对当前大学生阅读行为的诸多问题,如何引导阅读,已经成为高校教育必不可少的部分,同时基于现代阅读开放、多样等特点,也呼唤尽快构建导读新模式
  • 小熊猫沿袭 为数据集做贡献! 如果您喜欢小熊猫并想为一棵公共家谱做贡献,请阅读我们的! 概括 据估计,全球小熊猫数量不足10,000只,其中约1000只动物分布在世界各地的动物园中。 Red Panda Lineage数据集是可...
  • 该博客是小账本在前期开发阶段针对用户所进行的数据库设计,通过ER,数据字典,数据流来对该软件的数据库开发进行设计,并且附上部分源代码进行参考。 背景 待开发的软件名称为:小账本 作业名称:第三次团队...
  • 使用Flutter使用Streams和BLoC模式构建的Reddit客户端。 我将以此为基础来加深对BLoC的理解。 欢迎提出建议,问题和公关! 。 。 开始吧 要运行此应用,您需要在创建一个应用。 确保选择installed app 。 注意令牌...
  • 通过构建数据仓库实现图书馆数字资源整合,通过整合图书馆数字资源构建数据仓库,探讨图书馆数据仓库与数字资源整合无缝集成。采用星型结构的维度模式,创建一系列维度表和事实表,搭建馆藏书目、电子图书和电子期刊三个...
  • 构建模式的最初目的是将对象的构建过程(在某些情况下可能非常复杂)与对象本身的类分开,因此构建器可以根据构建过程的进行方式交付不同类型的对象。 这是关注点分离的明确示例。 不可变的对象是创...
  • 要想构建大型企业级的网站可没这么简单,这个博客的更新只是带你入门MVCWeb而已,仅供参考!不废话,跟我一步步来。我们来打开右边的解决方案资源管理器,然后找到Views\Shared_Layout.cshtml,点击打开它,如下所...
  • 将一个复杂对象的构建与它的表示分离,使得不同的构建过程可以创建不同的显示,但其根本还是不变。 使用场景 1、相同的方法,不同的执行顺序,产生不同的事件结果时; 2、多个部件或零件,都可以装配到一个对象...
  • 动机   在软件系统中,有时候面临着“一个复杂对象”的...模式定义   将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)。 结构类 案例分析 未使用构建器 class House{
  • 架构模式: 客户端 UI 构建 上下文 您已应用微服务架构模式。服务由业务能力/面向子域的团队开发,这些团队也负责用户体验。一些UI屏幕/页面显示来自多个服务的数据。例如,考虑亚马逊风格的产品详细信息页面,该...
  • 我们单击“工具”的选项找到“NuGet 程序包管理器”然后再找到“程序包管理器控制台”点击,如果不懂我说什么可以看下等缓冲以后会出现如下的界面,我们在出现的控制台里面输入如下代码(请注意代码的大小写哦)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,342
精华内容 2,136
关键字:

模式构建图