问如果我有一个方法,但这个方法有问题,我们换成了其他的设计,但是又不想修改原有程序中的invoke的code,应该用什么模式设计比较合适.
例:
class A{
  myinvoke();
}main(){
  A a =new a();
  a.myinvoke();
}然后A中加入新的方法
class A{
  myinvoke();
  
  myinvokeNew();
}问题就是在main中不修改原有代码,采用什么模式设计比较好,谢谢啦

解决方案 »

  1.   

    不知道你当初的设计是什么样的,我理解你可能是想在原有class A中添加或减少功能,这样的话可看看Facaed(外观模式),
    其实如果可以重构原有程序的话,建议你还是重构一下的比较好....
      

  2.   

    谢谢回复,如果用facade,那我还要重新构建一个facade类,然后在main中重新去调用facade类的方法,好像还是要修改原有代码的,如果将Class A修改成facade类,这样感觉也不是太好,毕竟在实际中我的class A还有其他的很多应用的
      

  3.   

    不太明白,你new的是myinvoke这个方法,和myinvokeNew有关系么?
      

  4.   

    这样就帮不到你了,其实如果你的main方法中真的就是那样写的话,这里面存在是一个实现依赖,不太好修改,建议你还是重构一下,用工厂来封装你class A比较好
      

  5.   

    模式分为三种,设计模式、体系结构模式与惯用法。其中惯用法是一种语言紧密相关的模式,例如,定界加锁模式其实是一种惯用法。 
    在C#项目开发过程中,很多情况下您已经使用了某些模式,但或许您并不知道自己所使用的这种解决方案是一种已经被总结归纳的模式。 
    工厂、策略、桥接、模板方法、代理等等23种Gof经典模式是属于设计模式,设计模式的粒度相对较小,基本上用于提高模块内部的可扩展性和可维护性需求 
    层、MVC、IoC/DI等属于体系结构模式,粒度比设计模式大,它是从项目的整体角度去看项目的架构。设计需要合理性,架构同样追求合理性,这就是架构模式的用途。 
    C#的经典样例petshop中,采用分层思想构架了整个网站,这里的分层就是体系结构模式;而在数据库访问层,则采用工厂模式来泛化数据库操作,使得业务层不需要关心您现在的数据库是SQL server的,还是oracle的。这就是设计模式的使用。 
    模式应用不是一两句话能够说清楚的,也不是一天两天能够体会的,需要楼主慢慢体会与学习。
      

  6.   

    用适配器Adapter模式
    interface IMyInvokeNew
    {
        public void MyInvokeNew();
    }
    public class AAdapater : IMyInvokeNew
    {
        private A a = new A();
         public void MyInvokeNew()
        {
            //这里面就可以用a对象
        }
    }main()
    {
      IMyInvokeNew a = new AAdapater();
      a.MyInvokeNew();
    }
      

  7.   

    是不能改调用代码还是不想改类A的代码?如果不想改调用代码,为何不弄个类B直接继承A,然后再在B上加方法?
      

  8.   

    没看懂你的意思,从你的描述来看,是不是业务变更比较大,但接口稳定?这样使用策略模式比较好// Strategy pattern -- Structural example  using System;// "Strategy"interface IStrategy
    {
      // Methods
      void AlgorithmInterface();
    }// "ConcreteStrategyA"class ConcreteStrategyA : IStrategy
    {
      // Methods
      public void AlgorithmInterface()
      {
      Console.WriteLine(
          "Called ConcreteStrategyA.AlgorithmInterface()");
      }
    }// "ConcreteStrategyB"class ConcreteStrategyB : IStrategy
    {
      // Methods
      public void AlgorithmInterface()
      {
        Console.WriteLine(
            "Called ConcreteStrategyB.AlgorithmInterface()");
      }
    }// "ConcreteStrategyC"class ConcreteStrategyC : IStrategy
    {
      // Methods
      public void AlgorithmInterface()
      {
        Console.WriteLine(
            "Called ConcreteStrategyC.AlgorithmInterface()");
      }
    }// "Context"class Context
    {
      // Fields
      IStrategy strategy;  // Constructors
      public Context( IStrategy strategy )
      {
        this.strategy = strategy;
      }  // Methods
      public void ContextInterface()
      {
        strategy.AlgorithmInterface();
      }
    }/// <summary>
    /// Client test
    /// </summary>
    public class Client
    {
      public static void Main( string[] args )
      {
        // Three contexts following different strategies
        Context c = new Context( new ConcreteStrategyA() );
        c.ContextInterface();    Context d = new Context( new ConcreteStrategyB() );
        d.ContextInterface();    Context e = new Context( new ConcreteStrategyC() );
         e.ContextInterface();
      }
    }  
      

  9.   

    http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html
    这里的模式文章不错,你可以看看
      

  10.   

    谢谢各位的关注,
    adapter和strategy都是要在原有的代码上面做修改的,跟facade一样,当然如果有interface那就完全没有问题了,
    我这边觉得看如果suppose没有interface并且在不动main里面代码的情况,有没有比较好的方法,即使抛开GOF的设计模式
    也可以,或者用什么danamic proxy啊什么之类的.谢谢
      

  11.   

    AOP诚然是一个比较好的方法,但是似乎工作量是比较大,我只是想寻求一个最简的方法
      

  12.   

    哦,不修改main代码前提下实现功能替换,IOC?
    看看spring.net能不能解决你的问题
      

  13.   

    把class A改个名,比如oldA然后:
    class A:oldA
    {
         public void myinvokeNew()
         {
         }
    }