• 设计模式:命令模式(Command Pattern)


    问题

    某个类中需要定义一个方法,该方法要实现的功能不确定的,需要等到程序执行该方法的时候才确定下来。

    例如:定义一个计算数组的方法,可能需要遍历输出数组,也有可能是需要对数组中元素求和。

    解决方案

    按照面向对象程序设计的原则,如果在设计类的时候,成员方法在不同的类中具体实现也是不同的,这种变化的方法可以抽取出来,形成接口。接口可以作为具体业务类的成员变量或者方法参数进行使用。

    在本例中,接口将作为业务处理类的方法参数,和待处理数据构成方法的参数列表。这种设计模式即为:命令模式(Command Pattern),即向一个方法传入行为。

    代码实现

    1.把变化的行为定义为接口

    /**把变化的行为定义为接口*/
    public interface ICommand {
    	/**处理数据的抽象方法*/
    	void process(int[] data);
    }
    

      

    2.定义业务处理类

    /**数据处理业务类*/
    public class DataProcess {	
    	public void service(int[] data,ICommand command){
    		command.process(data);
    	}
    }
    

      业务处理类中,service方法用于处理数组的计算,计算方法依赖于ICommand接口的实现。程序运行的时候,根据传入ICommand接口不同的实现类,实现对数组data的不同计算方式。

    3.定义不同的计算数组方法的实现类

    定义第一种计算方法:

    /**遍历输出数组元素*/
    public class PrintCommand implements ICommand {
    	@Override
    	public void process(int[] data) {
    		System.out.print("数组data中的元素有:");
    		for(int item:data){
    			System.out.print(item+"  ");
    		}		
    	}
    }
    

      

    定义第二种计算方法:

    /** 数组进行累加计算 */
    public class AddCommand implements ICommand {
    	@Override
    	public void process(int[] data) {
    		int sum=0;
    		for(int i=0;i<data.length;i++){
    			sum+=data[i];
    		}
    		System.out.println("数组所有元素之和为:"+sum);
    	}
    }
    

      

    4.测试实现

    	public static void main(String[] args) {
    		DataProcess dp = new DataProcess();
    		int[] data = { 1, 2, -10, 9, 18 };
    		ICommand ic = new AddCommand();
    		dp.service(data, ic);// 数组累加
    		ic = new PrintCommand();
    		dp.service(data, ic);// 数组遍历输出
    	}
    

      

    5.输出效果

    总结

    在本例中ICommad接口也称为“命令”,实际程序运行中,客户端调用传入的命令可能不同,因此需要把该命令抽象成接口,并作为业务类方法的参数进行使用,程序运行时可以传入不同的接口实现类,完成命令的具体实现。该设计模式就称为命令模式。



    本博客文章未经许可,禁止转载和商业用途!

    如有疑问,请联系: 2083967667@qq.com


  • 相关阅读:
    C# 异步锁
    C#异步编程基础入门总结
    C#异步编程基础入门总结
    C#与数据结构--图的遍历
    C#中IEumerable的简单了解
    C# prism 框架 MVVM框架 Prism系列之事件聚合器
    .NET Core 3 WPF MVVM框架 Prism系列之对话框服务
    C# prism 框架
    TaskAwaiter<TResult> 结构
    利用Eventlog Analyzer分析日志
  • 原文地址:https://www.cnblogs.com/rask/p/8309876.html
Copyright © 2020-2023  润新知