软件设计模式——命令模式(1)

1.面向接口编程引入

首先是讲了命令模式,如何通过面向接口编程实现古代万历皇帝派大臣去赈灾这一方法。

interface DC{
	public String work();
	
}
class Zhangsan implements DC{

	@Override
	public String work() {
		
		return "去救灾";
	}
	
}
class EM{
	public void call(DC dc)
	{
		System.out.println(dc.work());//皇帝叫大臣去做事
	}
}
public class StringTest {
	public static void main(String[] args) {
		EM em=new EM();
		DC dc=new Zhangsan();
		em.call(dc);
		

	}

}

这里应用到了多态,先说明一下什么是多态,以及继承多台和接口多态区别:
多态就是不同事物实现不同的方法,程序在执行期间根据传入的对象进行动态绑定,寻找这一子类对象中重写父类中的方法。通过继承的多态父类方法中可以写抽象方法也可以写非抽象方法,但是写了抽象方法之后就要去重写他,而且特别注意,子类中写了父类没有的方法的时候,在实现多态过程中,不可以使用子类自己的方法,因此不能实现多态。
然而在面向接口编程中,与继承不同的是,可以实现多实现,接口之间可以相互继承,实现该接口的类,所有方法必须重写,相对会更加灵活。
继承多态和接口多态区别:
https://blog.csdn.net/qq_36260974/article/details/87384147

代码实现简要类图
这里面皇帝em中用到了大臣作为参数,也就是依赖关系,箭头指向DC,而张三实现了DC接口。

2.方法改进

原来大家写的代码是只是抽离出大臣的接口,但是皇帝要去叫大臣还是有关联的,
命令模式需要解耦动作发出者和动作执行者,通过举例皇上传递圣旨的例子进行说明

interface SZ{//圣旨
	void dosomething();
}
class JSZ implements SZ{//救水灾这一个具体的圣旨
	private DC dc;//救水灾这一个圣旨需要有一个大臣去执行,用一个成员变量来表示
	public JSZ(DC dc)//这里为什么要用一个构造方法?
	{
		this.dc=dc;
	}
	@Override
	public void dosomething() {
		dc.jiushuizai();
		
	}
	
}
class DC{//这个大臣是专门来救水灾的
	void jiushuizai(){
		System.out.println("救水灾");
	}
}
class EM{
	public SZ sz;
	public void publish()
	{
		sz.dosomething();
	}
	public EM(SZ sz)
	{
		this.sz=sz;
	}
	
}
public class EMTest {

	public static void main(String[] args) {
		DC zs = new DC();//有一个大臣
		SZ water=new JSZ(zs);//有一个救水灾的圣旨
		EM wl=new EM(water);//万历皇帝创建的救水灾的圣旨
		wl.publish();//皇帝发布这一个圣旨
		

	}

}

引入成员变量和参数局部变量的区别
https://blog.csdn.net/weixin_42458708/article/details/90237134
内存中的堆栈
https://blog.csdn.net/weixin_42458708/article/details/82219334

该程序中应用到了很多的构造函数,目的是为了初始化成员变量,当类a中有一个方法传入的是一个类b,而不是一个具体的参数,建议把要传进来的类b作为类a的一个成员变量,这样该类加载的时候,这一个成员变量也会同步保存在堆中,然后在测试类中用构造方法,就不用说创建一个对象,然后把对象传进去了,减少代码量。

关于构造函数
https://www.cnblogs.com/cornucopia2015/p/4808098.html
https://blog.csdn.net/Qiuzhongweiwei/article/details/78965788?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4.nonecase

改进后的实现类图
皇上这个类中有圣旨这一个成员变量,属于关联关系,救水灾的圣旨实现了圣旨当中的方法,圣旨需要大臣来执行,大臣是圣旨当中的一个成员变量,故是关联关系,这样就实现了皇上和大臣的解耦。
依赖关系应该是要类A中应用到了类B作为对象参数才是属于依赖。
这就是所谓的命令模式了。

3.jdk源码应用

https://blog.csdn.net/ZHUO_SIR/article/details/81430328
在这里插入图片描述

4.实际案例

电视机遥控电视

•电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。显然,电视机遥控器就是一个典型的命令模式应用实例。
在这里插入图片描述
自己的一些总结,如有不对的地方,欢迎互相交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值