前言
在业务中经常会遇到根据switch或if判断来走不同的流程。
如果这些流程中有相似性,我们可以将它封装为接口,然后构建不同的类去调用。
过程
举个例子:比如我们大家可能都是人,在这个喧嚣而又复杂的社会中扮演着不同的角色。有的人是老板、有的是公务员,但大多数都是普通人。管你是什么人,你都要吃饭和玩,这是所有生物的本能呢。
所以就有了一个动物本能的接口,所有动物都具有该功能
/**
* 动物本能
*
* @author MinWeikai
* @date 2021/6/5 11:29
*/
public interface AnimalInstinct {
void play();
void eat();
}
而我们人类的生活就是不断的思考、体会人生和做我们开心的事
/**
* 人也具有动物的本能
*
* @author MinWeikai
* @date 2021/6/5 11:30
*/
public abstract class AbstractPerson implements AnimalInstinct {
protected String name = "所有人";
protected abstract void think();
void life(String name){
this.name = name;
this.think();
this.happy();
}
void happy() {
this.eat();
this.play();
}
}
社会中人类扮演的每种角色都具有相同的功能,但具体实现又各不相同
/**
* 具体的公务员
*
* @author MinWeikai
* @date 2021/6/5 11:33
*/
public class CivilServant extends AbstractPerson {
@Override
protected void think() {
System.out.println(name +"一切为了人民!");
}
@Override
public void play() {
System.out.println(name +"玩游戏");
}
@Override
public void eat() {
System.out.println(name +"吃皇粮");
}
}
/**
* 具体的普通人
*
* @author MinWeikai
* @date 2021/6/5 11:33
*/
public class AveragePerson extends AbstractPerson {
@Override
protected void think() {
System.out.println(name +"今天要搬砖还是躺平?");
}
@Override
public void play() {
System.out.println(name +"玩游戏");
}
@Override
public void eat() {
System.out.println(name +"吃烧烤");
}
}
不论是什么角色,在社会这个大工厂中,大众对他们就是刻板印象
你是averagePerson=普通人,那就是属于AveragePerson角色
/**
* 人类角色工厂
*
* @author MinWeikai
* @date 2021/6/5 12:12
*/
public class AbstractPersonFactory {
static Map<String, AbstractPerson> personMap = new HashMap<>();
static {
personMap.put("averagePerson", new AveragePerson());
personMap.put("civilServant", new CivilServant());
}
public static AbstractPerson getPerson(String character) throws Exception {
return Optional.ofNullable(personMap.get(character)).orElseThrow(Exception::new);
}
}
人们看到你这个角色,就知道你是什么人
/**
* @author MinWeikai
* @date 2021/6/5 12:17
*/
public class AbstractPersonFactoryTest {
public static void main(String[] args) throws Exception {
AbstractPerson averagePerson = AbstractPersonFactory.getPerson("averagePerson");
averagePerson.life("张伟");
}
}
大众认知中该角色的张伟
Connected to the target VM, address: '127.0.0.1:56191', transport: 'socket'
张伟今天要搬砖还是躺平?
张伟吃烧烤
张伟玩游戏
Disconnected from the target VM, address: '127.0.0.1:56191', transport: 'socket'
Process finished with exit code 0
总结
由上述代码可以看出只要继承了该抽象类AbstractPerson,都要实现think()、play()、eat()方法,这也是所有人的生活,人类的悲欢都是相通的。
具有相同属性和行为,可用模板代码实现。
未来又有新的角色诞生,他还是要继承AbstractPerson,然后在社会这个工厂里注册他的角色。
在动物本能类中AnimalInstinct具有相同功能都应实现该类,如抽象猪、抽象狗等。
使用以上模式可以将类似类、类似功能代码不断地封装。易于维护,使用者无需关心方法的调用,只需继承对应的抽象类、关心自己角色的实现即可。
代码
本文由博客群发一文多发等运营工具平台 OpenWrite 发布