java中的两个设计模式:模板模式和命令模式的讲解

java设计模式:模板\命令

模板模式

抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式。如果编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,这就是一种模板模式的设计方式。
抽象方法不能有方法体、抽象类不能实例化、含有抽象方法的类只能被定义成抽象类、抽象类的构造器不能用于创建实例,主要是用于被其子类调用。
当使用abstract修饰类时,表明这个类只能被继承;当使用abstract修饰方法时,表明这个方法必须由子类提供实现(即重写),而final修饰的类不能被继承,final修饰的方法不能被重写,因此final和abstract永远不能同时使用。
abstract不能用于修饰成员变量,不能用于修饰局部变量,不能修饰构造器。
接口是一种特殊的抽象类。
接口体现的是一种规范,抽象类体现的是一种模板式的设计。

命令模式

生活之中有许多开关,通过开关可以控制电器的打开和关闭,例如电灯、电脑、风扇。开关与电灯、排气扇并无直接关系,一个开关安装之后可能用来控制电灯,也可能用来控制排气扇或者其他电器。在这里可把开关看作是个接口,电器看作是要处理的对象,不管他是什么电脑电灯的,只要它需要有开关,开启和关闭看作是要执行的行为。可以考虑使用一个Command接口来定义一个方法,用这个方法来封装"开启/关闭行为"。

public interface Command {
	void process(String s);
}

定义打开行为实现类:

public class On implements Command {

	@Override
	public void process(String s) {
		// TODO Auto-generated method stub
		String p=s+"被打开";
		System.out.println(p);
	}

}

定义关闭行为实现类:

public class Off implements Command {

	@Override
	public void process(String s) {
		// TODO Auto-generated method stub
		String p=s+"被关闭";
		System.out.println(p);
	}

}

处理对象的处理类,在这个处理类中包含了一个process()方法,这个方法无法确定处理对象的处理行为(打开/关闭),所以定义该方法时只是传入接口对象:

public class DoThing {

	public void process(String name,Command cmd) {
		cmd.process(name);
	}
	
}

单元测试:

		@Test
		public void t() {
			DoThing dt=new DoThing();
			dt.process("电脑", new On());
			dt.process("电脑", new Off());
			dt.process("风扇", new On());
			dt.process("风扇", new Off());
			dt.process("电视", new On());
			dt.process("电视", new Off());
		}

在这里插入图片描述

命令模式的小案例

要求通过命令模式自设计数组自加、平方
接口:Command

public interface Command {

	void process(int[] element);
	
}

自加实现类:Plus

public class Plus implements Command{

	@Override
	public void process(int[] element) {
		// TODO Auto-generated method stub
		for (int i = 0; i < element.length; i++) {
			element[i]+=element[i];
		}
		System.out.println(Arrays.toString(element));
	}

}

自乘(平方)实现类:Square

public class Square implements Command{

	@Override
	public void process(int[] element) {
		// TODO Auto-generated method stub
		for (int i = 0; i < element.length; i++) {
			element[i]*=element[i];
		}
		System.out.println(Arrays.toString(element));
	}

}

定义数组处理类:ArrayDo

public class ArrayDo{

	public void process(int[] array,Command cmd) {
		cmd.process(array);
	}
	
}

单元测试:

		@Test
		public void t1() {
			ArrayDo ad=new ArrayDo();
			int[] arr= {5,1,2,-4};
			int[] brr= Arrays.copyOf(arr, arr.length);
			ad.process(arr, new Square());//让arr每个数都平方一次
			ad.process(brr, new Plus());//让brr每个数都自加一次
		}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brrby

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值