前言
在业务中经常会遇到根据switch或if判断来走不同的流程。
如果这些流程中有相似性,我们可以将它封装为接口,然后构建不同的类去调用。
过程
举个例子:比如我们大家可能都是人,在这个喧嚣而又复杂的社会中扮演着不同的角色。有的人是老板、有的是公务员,但大多数都是普通人。管你是什么人,你都要吃饭和玩,这是所有生物的本能呢。
所以就有了一个动物本能的接口,所有动物都具有该功能
1 2 3 4 5 6 7 8 9 10 11 12
|
public interface AnimalInstinct {
void play();
void eat(); }
|
而我们人类的生活就是不断的思考、体会人生和做我们开心的事
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
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(); } }
|
社会中人类扮演的每种角色都具有相同的功能,但具体实现又各不相同
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
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 +"吃皇粮"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
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角色
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
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); } }
|
人们看到你这个角色,就知道你是什么人
1 2 3 4 5 6 7 8 9 10 11 12
|
public class AbstractPersonFactoryTest {
public static void main(String[] args) throws Exception { AbstractPerson averagePerson = AbstractPersonFactory.getPerson("averagePerson"); averagePerson.life("张伟");
} }
|
大众认知中该角色的张伟
1 2 3 4 5 6 7
| 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具有相同功能都应实现该类,如抽象猪、抽象狗等。
使用以上模式可以将类似类、类似功能代码不断地封装。易于维护,使用者无需关心方法的调用,只需继承对应的抽象类、关心自己角色的实现即可。
代码
上述代码路径