我的Design Pattern之旅[4]:使用Generic改進Strategy Pattern(OO)

Abstract

在(原创) 我的Design Pattern之旅:使用template改进Strategy Pattern (OO) (Design Pattern) (C/C++) (template)中,使用了C++的template改进strategy pattern,本文使用C#的generic改进strategy pattern。

Introduction

C# 2.0加入了generic对泛型的支援,所以想将原来C++的template程式一行一行的改成C# generic。

在strategy pattern中,通常为了让strategy能完全存取物件的public method/property,我们会利用传this将整个物件传给strategy

public void drawShape() {
 this.shape.draw(this);
}

为了达成此需求,我们的interface须如此定义

interface IShape {
 void draw(Grapher grapher);
}

完整的程式码如下


1/**//*
2(C) OOMusou 2007 http://oomusou.cnblogs.com
3
4Filename  : DP_StrategyPattern3_polymorphism_this.cs
5Compiler  : Visual Studio 2005 / C# 2.0
6Description : Demo how to use Strategy Pattern with this
7Release   : 04/07/2007 1.0
8*/
9using System;
10
11interface IShape {
12 void draw(Grapher grapher);
13}
14
15class Grapher {
16 private IShape shape;
17 private string text;
18
19 public Grapher() { }
20 public Grapher(IShape shape) : this(shape, "Hello Shape!!") { }
21 public Grapher(IShape shape, string text) {
22  this.shape = shape;
23  this.text = text;
24 }
25
26 public void drawShape() {
27  this.shape.draw(this);
28 }
29
30 public void setShape(IShape shape, string text) {
31  this.text = text;
32  this.shape = shape;
33 }
34
35 public string getText () {
36  return this.text;
37 }
38}
39
40
41class Triangle : IShape {
42 public void draw(Grapher grapher) {
43  Console.WriteLine("Draw {0:s} in Triangle", grapher.getText());
44 }
45}
46
47class Circle: IShape {
48 public void draw(Grapher grapher) {
49  Console.WriteLine("Draw {0:s} in Circle", grapher.getText());
50 }
51}
52
53class Square : IShape {
54 public void draw(Grapher grapher) {
55  Console.WriteLine("Draw {0:s} in Square", grapher.getText());
56 }
57}
58
59class main {
60 public static void Main() {
61  Grapher theGrapher = new Grapher(new Square());
62  theGrapher.drawShape();
63
64  theGrapher.setShape(new Circle(), "Hello C#!!");
65  theGrapher.drawShape();
66 }
67}

执行结果

Draw Hello Shape!! in Square
Draw Hello C#!! in Circle

时间: 2024-12-24 20:57:13

我的Design Pattern之旅[4]:使用Generic改進Strategy Pattern(OO)的相关文章

我的Design Pattern之旅[3]:使用template改進Strategy Pattern(OO)

在(原创) 我的Design Pattern之旅:Strategy Pattern (初级) (Design Pattern) (C++) (OO C++) (Template C++)中,我们使用了strategy pattern让Grapher能画Triangle.Circle和Square 因为需求再次改变,:D,我们希望Grapher能将文字印在各Shape中,执行结果如下 Draw Hello Shape!! in Square Draw Hello C++!! in Circle 为

我的Design Pattern之旅[7]:使用泛型改進Adapter Pattern(OO)

Introduction 在(原创) 我的Design Pattern之旅[6] : Adapter Pattern (OO) (Design Pattern) (C/C++) (.NET) (C#) (C++/CLI) (VB) 中的Grapher范例,我们看到Class Adapter必须针对Triangle.Circle.Square量身订做TriangleDrawAdapter.CircleDrawAdapter.SquareDrawAdapter,虽然符合OCP,但每个class就得需

我的Design Pattern之旅[1]:Strategy Pattern (OO)

Abstract Head First Design Patterns是用strategy pattern当作第一个范例,而陈俊杉教授也是用strategy当作授课的第一个pattern,可见strategy的确适合初学者学第一个学习的pattern. Intent 定义一整族演算法,将每一个演算法封装起来,可互换使用,更可以在不影响外界的情况下各别抽换所引用的演算法. 其UML表示法 GoF说strategy也称为policy,我个人喜欢称它为plugin,因为可以动态的换演算法,如同在ecl

设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式"."状态模式"等.当然在重构时,有的地方没有点明使用的是那种设计模式.从今天开始,我们就围绕着设计模式这个主题来讨论一下我们常用的设计模式,当然"GoF"的23种设计模式不会全部涉及到,会介绍一些常见的设计模式.在接下来我们要分享的设计模式这个系列博客中,还是以Swi

策略模式(Strategy Pattern) 详解

策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式; 使用set()方法, 重新设定接口的行为. 提供行为的调用的方法(如perform), 需要调用接口(interface)的固有方法(fly & quack)即可. 代码: package strategy; public abstract class Duck

解读设计模式:策略模式(Strategy Pattern)

一.模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法. 在我应用OOP的设计过程演化(三)这篇文章里应用到了策略模式,在图书的租金计算上分多种情况,每一种不同类型的图书的租金是不一样的,而站在用户的角度来看,不同类型用户的租金收取又是不一样的,见下面分析: 计算机类图书:会员租借打5折,普通顾客租借打6折. 小说类图书:会员租借打6折,普通顾客租借打8折. 生活类图书:会员租借打9

第21章 策略模式(Strategy Pattern)

原文 第21章 策略模式(Strategy Pattern) 策略模式       导读:策略模式看完之后,大多数人都会感觉有点混了,包括我,感觉策略模式是一种OO思想的体现(纯属个人拙见).       概述:         策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.     抽象策略角色: 策略类,通常由一个接口或者抽象类实现.     具体策略角色:包装了相关的算法和行为.     环境角色:持有一个策略类的

策略模式(Strategy Pattern)

一.策略模式 在策略(Strategy Pattern)中,一个类的行为或算法可以在运行时动态的更改.这种类型的设计模式属于行为模式(Behavioral Pattern-对象间通信).在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象.策略对象改变context对象的执行算法. 二.介绍 意图: 定义一系列算法,把它们一个个封装起来,并且是她们可互相替换. Define a family of algorithms, encapsulate each

乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabcd 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里(两种可互换的算法).由客户端决定使用哪种算法. Me