策略和享元模式

2023-11-30

我读过“策略对象通常会成为很好的蝇量级”(来自可重用面向对象软件的设计模式元素),我想知道如何实现这一点。我在互联网上没有找到任何例子。

下面的代码(C#)是否符合这个想法?

Thanks!

using System;
using System.Collections.Generic;

namespace StrategyFlyweight
{
    class Program
    {
        static void Main(string[] args)
        {
            Client client = new Client();
            for(int i = 1; i <= 10;i++)
            {
                client.Execute(i);
            }
            Console.ReadKey();
        }
    }

    public interface IStrategy
    {
        void Check(int number);
    }

    public class ConcreteStrategyEven : IStrategy
    {
        public void Check(int number)
        {
            Console.WriteLine("{0} is an even number...", number);
        }
    }

    public class ConcreteStrategyOdd : IStrategy
    {
        public void Check(int number)
        {
            Console.WriteLine("{0} is an odd number...", number);
        }
    }

    public class FlyweightFactory
    {
        private Dictionary<string, IStrategy> _sharedObjects = new Dictionary<string, IStrategy>();

        public IStrategy GetObject(int param)
        {
            string key = (param % 2 == 0) ? "even" : "odd";

            if (_sharedObjects.ContainsKey(key))
                return _sharedObjects[key];
            else
            {
                IStrategy strategy = null;
                switch (key)
                {
                    case "even":
                        strategy = new ConcreteStrategyEven();
                        break;
                    case "odd":
                        strategy = new ConcreteStrategyOdd();
                        break;
                }
                _sharedObjects.Add(key, strategy);
                return strategy;
            }
        }
    }

    public class Client
    {
        private IStrategy _strategy;
        private FlyweightFactory _flyweightFactory = new FlyweightFactory();

        public void Execute(int param)
        {
            ChangeStrategy(param);
            _strategy.Check(param);
        }

        private void ChangeStrategy(int param)
        {
            _strategy = _flyweightFactory.GetObject(param);
        }
    }
}

我认为要在这里正确实现享元模式,您的工厂方法应该始终返回特定策略的相同实例(例如ConcreteStrategyEven)而不是每次都构建一个新实例。

如果我没记错的话,说策略对象是好的享元的要点是它们通常不封装任何状态(因为它们代表算法而不是实体)并且可以重用。

以下是 Flyweight 工厂示例的链接:http://www.java2s.com/Code/Java/Design-Pattern/FlyweightFactory.htm。请特别注意这部分:

  public synchronized FlyweightIntr getFlyweight(String divisionName) {
    if (lstFlyweight.get(divisionName) == null) {
      FlyweightIntr fw = new Flyweight(divisionName);
      lstFlyweight.put(divisionName, fw);
      return fw;
    } else {
      return (FlyweightIntr) lstFlyweight.get(divisionName);
    }
  }

在工厂方法中,一个新的FlyweightIntr仅当正确的值不可用时才进行初始化;否则它是从检索的lstFlyweight.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

策略和享元模式 的相关文章

  • 寻找一种重构 D3.js 风格的方法链接模式的方法

    在学习 D3 js 时 我遇到了博客文章 http bost ocks org mike chart 解释其可重用代码单元背后的主要设计模式 我复制了下面的相关代码 下面呈现的模式的方式正是在 D3 代码库和插件中使用的方式 example
  • 对于 Web 应用程序结构的最佳实践,您有哪些建议? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我在工作中做了很多定制应用程序 我正在尝试为新应用程序定义一些标准 有点像元素 CSS 你如何组织样式表 我是否应该为整个网站提供一个基本样式表
  • 向项目添加资源的设计

    我有课Project Resource and File where A Project包含列表资源 Each Resource包含以下列表Files特定类型的 这被映射到 XML
  • 为什么要分离接口和实现?

    在生产代码中 我经常看到定义如下的类 public interface SomeComponent Some methods public class SomeComponentImpl implements SomeComponent S
  • Javascript 沙箱模式示例实现

    在 Stoyan Stefanov 的伟大著作 JavaScript Patterns 的第 101 页中 他解释了沙箱模式 我非常喜欢他的书 但我真的错过了一些现实生活中的例子 然后更好地理解他所谈论的内容 我正在寻找一个现实生活中的工作
  • 三层 Asp.Net 应用程序中的异常处理

    1 据我了解 在three tierAsp Net应用程序我们应该通过以下方式实现异常处理 a 我们应该把try catch围绕代码块 位于三层中的任何一层 我们希望页面能够从该代码块正常恢复 当此代码生成异常时 b 我们不应该放try c
  • Java API 中单例类的示例

    Java API 中单例设计模式的最佳示例有哪些 是个Runtime类单例 我只想到两个例子 java lang Runtime getRuntime http java sun com javase 6 docs api java lan
  • Joshua Bloch 的构建器设计模式有何改进?

    早在 2007 年 我就读过一篇关于 Joshua Blochs 所采用的 构建器模式 的文章 以及如何修改它以改善构造函数和 setter 的过度使用 特别是当对象具有大量属性 其中大部分属性是可选的 时 本文对此设计模式进行了简要总结
  • java异常处理策略[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MonoState、Singleton 或派生形式:CRUD 应用程序的最佳方法?

    我有一个相当大的 CRUD WinForm 应用程序 其中有许多对象 人员 注册 计划 案例注释等 该应用程序由 30 多种表单组成 UI 逻辑上被分解 会员 注册 计划 案例说明等 我正在尝试弄清楚如何创建我的人物对象搜索后搜索表格并将对
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 处理大数据二进制文件

    我正在处理包含原始数据的大型二进制文件 每个大约 2 GB 这些文件具有明确定义的结构 其中每个文件都是一个数组events 每个事件都是一个数组data banks Each event and data bank有一个结构 header
  • 为什么工厂模式会这样工作?

    我从未真正研究过工厂模式 今天决定花时间根据本文创建一个快速示例 http msdn microsoft com en us library ee817667 aspx http msdn microsoft com en us libra
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • Struts ActionForm 属性应该是什么类型?

    我使用 Struts 1 2 4 继承了这个巨大的遗留 Java Web 应用程序 我有一个关于 ActionForms 的具体问题 其中一些仅具有字符串属性 即使对于数字 其中一些使用看似合适的类型 整数 日期 字符串等 这里的最佳实践是
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • 你们中有多少人进行三层设计?

    多年来 三层设计一直是我数据库驱动应用程序的标准设计理念 它从未让我失望过 对于那些练习它的人 描述一下你的层次 我发现很多人混淆了业务层和数据访问层 使其更像是 2 5 层设计 我更喜欢使用存储过程将数据层几乎完全移动到数据库中 并且在代
  • 通过 Javascript 不断查询服务器 - 好主意吗?

    我有一个小型网站 大约有 5 到 10 名管理员 我已将其设置为监视每个管理员正在执行的操作 添加项目 删除项目等 我的管理面板中有一个列表 显示了集体管理部门之前执行的 10 项活动 今天 我决定每 30 秒进行一次自我更新 我的问题很简
  • const int 列表而不是 enum

    我开始研究大型 C 代码库 并发现使用带有多个 const ints 字段的静态类 这个类的行为与枚举完全一样 我想将类转换为实际的枚举 但权力被拒绝 我想转换它的主要原因是这样我可以将枚举作为数据类型而不是 int 这对可读性有很大帮助

随机推荐