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