设计模式之美:Product Trader(操盘手)

索引

  • 意图

  • 结构

  • 参与者

  • 适用性

  • 效果

  • 相关模式

  • 实现
    • 实现方式(一):Product Trader
      的示例实现。

意图

使客户程序可以通过命名抽象超类和给定规约来创建对象。

Product Trader 让客户程序与 Product
类解耦,从而使得类的层级结构、框架和应用程序易于改写、配置和演进。

Let clients create
objects by naming an abstract superclass and by providing a
specification.

A Product Trader
decouples the client from the product and thereby eases the adaption,
configuration and evolution of class hierarchies, frameworks and
applications.

结构

参与者

Client

  • 为 ConcreteProduct 类创建
    Specification。

  • 为 Product Trader 提供 Specification 以初始话构建过程。

Product

  • 定义类层次的接口。

ConcreteProduct

  • Product 抽象类的具体类。

  • 提供足够的信息以判定是否满足 Specification。

ProductTrader

  • 从 Client 接收一个 ConcreteProduct 对应的 Specification。

  • 映射 Specification 和 Creator。

  • 提供映射配置机制。

  • 调用 Creator 以生成符合 Specification 的 ConcreteProduct。

Creator

  • 定义创建 ConcreteProduct 实例的接口。

  • 知道如何根据 Specification 创建合适的 ConcreteProduct。

Specification

  • 一个 Specification 代表着一个 ConcreteProduct 类。

  • 作为映射和查询 Creator 的条件参数。

适用性

当以下情况成立时可以使用 Product Trader 模式:

  • 当你想让客户程序完全独立于 Product 实体类的实现时。

  • 你需要在运行时根据可用的规约条件动态的生成 Product 对象时。

  • 你需要为给定的规约条件配置相应的 Product 类对象。

  • 你需要在不影响客户代码的条件下修改和演进 Product 类的层次。

效果

  • Client 程序完全独立于 ConcreteProduct
    类层次。

  • 可以在运行时决定 Product 的具体类。

  • 可以根据特定的领域对 Product 进行配置。

  • Product 类层次更易于演进。

  • 衍生新的 ConcreteProduct 更加方便。

  • Product 类可以是负责的组件。

相关模式

  • 可以尝试在 Factory Method 模式无法工作或不太适合时,尝试使用
    Product Trader。Factory Method 常使 Product 和 Creator 之间形成循环依赖。

实现

实现方式(一):Product Trader
的示例实现。


  1 namespace ProductTraderPattern.Implementation1
2 {
3 public class Specification
4 {
5 public string Criteria { get; set; }
6
7 public bool IsSatisfiedBy(Product product)
8 {
9 return product.Criteria == this.Criteria;
10 }
11
12 public override int GetHashCode()
13 {
14 return Criteria.GetHashCode();
15 }
16
17 public override bool Equals(object obj)
18 {
19 return GetHashCode().Equals(obj.GetHashCode());
20 }
21 }
22
23 public abstract class Product
24 {
25 public abstract string Criteria { get; }
26 }
27
28 public class ConcreteProductA : Product
29 {
30 public override string Criteria
31 {
32 get
33 {
34 return "SpecForConreteProductA";
35 }
36 }
37 }
38
39 public class ConcreteProductB : Product
40 {
41 public override string Criteria
42 {
43 get
44 {
45 return "SpecForConreteProductB";
46 }
47 }
48 }
49
50 public abstract class ProductCreator
51 {
52 public abstract Product Create(Specification spec);
53 }
54
55 public class ConcreteProductCreator : ProductCreator
56 {
57 public override Product Create(Specification spec)
58 {
59 if (spec.Criteria == "SpecForConreteProductA")
60 {
61 return new ConcreteProductA();
62 }
63 else if (spec.Criteria == "SpecForConreteProductB")
64 {
65 return new ConcreteProductB();
66 }
67
68 // any factory you can use here
69 throw new NotSupportedException();
70 }
71 }
72
73 public class ProductTrader
74 {
75 private Dictionary<Specification, ProductCreator> _dict
76 = new Dictionary<Specification, ProductCreator>();
77
78 public Product CreateFor(Specification spec)
79 {
80 ProductCreator creator = LookupCreator(spec);
81 Product product = creator.Create(spec);
82 return product;
83 }
84
85 public ProductCreator LookupCreator(Specification spec)
86 {
87 return _dict[spec];
88 }
89
90 public void AddCreator(Specification spec, ProductCreator creator)
91 {
92 _dict.Add(spec, creator);
93 }
94
95 public void RemoveCreator(Specification spec, ProductCreator creator)
96 {
97 _dict.Remove(spec);
98 }
99
100 public void SubstituteCreator(Specification spec, ProductCreator creator)
101 {
102 _dict[spec] = creator;
103 }
104 }
105
106 public class Client
107 {
108 public void TestCase1()
109 {
110 Specification spec1 = new Specification();
111 spec1.Criteria = "SpecForConreteProductA";
112
113 Specification spec2 = new Specification();
114 spec2.Criteria = "SpecForConreteProductA";
115
116 ProductCreator creator = new ConcreteProductCreator();
117
118 ProductTrader trader = new ProductTrader();
119 trader.AddCreator(spec1, creator);
120 trader.AddCreator(spec2, creator);
121
122 Specification spec3 = new Specification();
123 spec3.Criteria = "SpecForConreteProductA";
124
125 Product product = trader.CreateFor(spec3);
126 }
127 }
128 }

设计模式之美》为 Dennis
Gao
 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。

时间: 2024-10-14 05:33:19

设计模式之美:Product Trader(操盘手)的相关文章

一位操盘手的临别赠言

一位操盘手的临别赠言 因为受到一家机构的邀请,我所掌管的资金将要增加十倍以上,这是一个很大的挑战,原来用得得心应手的许多赢利方式已不再适用,必须潜心研究一些适用于大资金的赢利模式,故而我将离开论坛全力迎接新的人生挑战.在03年稳定指数,击溃个股的暴跌中,我目睹了许多散户在寒风中悲痛的神情,这也勾起了我对97年刚进股市时买进长虹,发展的惨败的极其痛苦的回忆,那永生难忘的一幕又在新一代股民身上重现,令人不***,故在临走之前写下此文,将一套赢利模式送与论坛上有缘的朋友,希望能有助于你们从此摆脱人生的

代理商变操盘手:在线旅游到底玩啥花样

近段时间,不,准确地说是近几年来,狂飙突进的在线旅游行业一直处于毁誉参半的状态.从好的一方面看,确实给大众出行.旅游.住宿等带来便利:而从坏的一方面看,肆意改签.退单.假机票.天价退票费.无序的管理手段等,也让在线旅游网站等饱受诟病.但无论如何,在线旅游行业还是以让人瞠目结舌的速度向前发展. 尤其需要注意的是,近来多家在线旅游网站之间的并购,将其愈发地向垄断的态势推进.但独霸市场也不能让其满足,在线旅游发展在完成横向发展之后,开始纵向发展,向上游发起进攻,试图从下游的代理商角色变成掌控全局的操盘

股峰求道 - 炼股成金:从散户到操盘手的修炼法则(2015年5月11日)

<炼股成金:从散户到操盘手的修炼法则> 作 者:股峰求道译 者:系 列:出 版:广东人民出版社字 数:183千字阅读完成:2015年5月11日

中国第一批操盘手的真实下场(绝对真实档案)!

中国第一批操盘手的真实下场(绝对真实档案)! 2014-07-27  江苏常熟... 姓 名 属性 下场 经典 案例 文凭 风格 爱好  最高财富 01 马 晓 私募 赔光 有 界龙实业 高中 激进 赌博 1000万 02 唐万新 私募 赔光 有 湘火炬 大专 重组 旅游 30亿 03 康晓阳 券商 入狱 有 申华股份 本科 差价 围 棋 6000万 04 庄晓雁 券商 逃亡 有 苏常柴 本科 双轨 钓鱼 100万 05 张少鸿 期货 入狱 有 深发 展 中专 策动 历史 1亿 06 吕新建 私

操盘手“本来生活”,这样把“褚橙”卖成“励志橙”

一个普通的橙子,因为被冠以了褚橙的名字,却意外引爆流行成了励志橙,在11月的电商大战中激发情绪波澜,既令人惊讶,却也并非偶然.这背后,一个小食品电商“本来生活”功不可没.这家公司办公室里的一块白板上写着大字:“1000单是我们干的”,周围布满员工的签名.到12月6日,他们进货褚橙200吨. <商业周刊中文版>分析说,这是因为褚橙应了美国专栏作家马尔科姆·格拉德威尔在<引爆点>(Tipping Point)中提炼的三个条件:“个别人物法则.附着力因素和环境威力法则”,即某些意见领袖或

操盘手英超大数据观察:13/14赛季平局仅20.5%

时下大数据是一个时髦的词汇,前几天在朋友圈里看到一篇<某电商文胸数据:A少了C多了>,文中有数据显示,某省已经摆脱了胸部最小的省份等等.这篇东西对普通人来说可以当作花边了解一下,增加点茶余饭后的谈资,对商家来说则是制定商业计划的风向标. 经历了2014巴西世界杯,大数据在博彩中的运用也越来越受到重视.上周末新赛季的英超(微博 专题) 联赛已经揭幕,10场比赛主队仅有阿森纳(官方微博 官网 数据 )和利物浦(官方微博 数据) 两强收获3分,8支客队保持不败(2平6胜),多少让人感觉一丝冷意,尤其

荣耀配资:股票配资的操盘手应该具备什么要求

经过几十年的发展,现在我们国家的市场经济发展到了一个新的阶段,人们的生活条件有了很明显的改善,大家也都开始加入到了投资的行列当中来了.其中选择进行股票投资的朋友有很多,而即使没有足够的资金,也有很多人会通过配资来进行操作.那么大家知道投资股票配资的操盘手应该具备哪些要求吗? 一.需求的条件许多,最重要的是心态.操盘手承受着巨大的压力,因为不是他自己的资金,而且比他自己的资金的要求更高.一旦发生损失金额或超过时限,操盘手的命运通常是会被立即解雇,并且他不会获得自己的保证金或存款.失去了很多.因此,

一良心操盘手:我们是这样玩死散户的! z

做庄必须考虑很多问题: 第一是证监会的监控.操控股票不能让他们抓住把柄,这时候就要考虑多户头,或者拉几个私募大户集体作战. 第二要考虑产业资本的问题.如果我们拉的时候,他们看到利润可观,结果大量抛出筹码,那我们就惨了,必然会亏本出局,在做之前就必需先和他们沟通好,而且还要了解他们手上的流通盘是多少,抛售意向如何,这就是大小非问题. 第三个要考虑的是老庄.如果这个股没有被老庄放弃,那我是尽量不会去碰的,因为一但被老庄反做,那你死得就惨了,就像中国联通[4.98% 资金 研报]套游资一样,那死得是非

现货操盘手精髓语录

计划篇第1条 成功的密码是:简单的动作,不断的正确重复第2条 操盘的精髓是:谈笑间用兵,强于紧张中求胜第3条 没有计划不要上班,没有计划不要下单第4条 顺势是最好的计划,逆势是最坏的神话第5条 你不理财财不理你,你不用功迟早破功第6条 懂得对作才能作对,不懂对作就会乱作第7条 谈笑间可以作波段,紧张中只能玩短线第8条 盘前要有交易计划,盘中不要听人比划第9条 沙盘推演事前排练,知己知彼百战不厌第10条 搜足资料市市如料,按表操课无所不克两极篇第11条 强不再强防转弱,弱不再弱会转强第12条 不要