代码模拟这样一个场景:客户要盖房子,需要去劳务市场找个合适的包工头来承包自己的工程,找到了合适的包工头,最后开工。
我按照自己的理解用代码来逐一剖析、实现这个场景:
1、盖房子的步骤都是大同小异的,比如所有的盖房子都是打地基、垒砖
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:24
* @Desc: 建房子的步骤都大同小异,每个包工头都会按照自己的方式去实现这些步骤(策略模式)
*/
public interface BuildHouse {
String 打地基();
String 垒砖();
}
2、每个包工头都会有自己的盖房子策略(比如有包工头张三、李四)
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:28
* @Desc: 张三号称自己在包工头界天下第一
*/
public class 包工头张三 implements BuildHouse {
@Override
public String 打地基() {
return "我们团队打地基是天下第一";
}
@Override
public String 垒砖() {
return "我们团队垒砖是天下第一";
}
}
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:29
* @Desc: 李四号称自己在包工头界举世无双
*/
public class 包工头李四 implements BuildHouse {
@Override
public String 打地基() {
return "我们团队打地基是举世无双";
}
@Override
public String 垒砖() {
return "我们团队垒砖是举世无双";
}
}
3、客户在包工头界也没有认识的人,所以只能去劳务市场找了。所有的包工头都在劳务市场注册在案,所以我们先来个枚举类来标识所有的包工头
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:34
* @Desc: 所有在劳务市场注册的包工头(枚举标识类)
*/
public enum RegisterMarket {
张三("ZS"), 李四("LS");
private String name;
RegisterMarket(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
4、对客户这种包工头界没有熟人的来说,劳务市场其实就是个门面。客户在劳务市场找到合适的包工头后,就可以盖房子了,看代码及注释:
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:39
* @Desc: 劳务市场,很多包工头都在这等客户谈生意(门面类)
*/
public class LabourMarket {
private BuildHouse buildHouse; //客户选的包工头盖房子
private RegisterMarket registerMarket; //客户选的包工头
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:40
* @Desc: 客户从市场里选一个注册在案的包工头标识,然后工厂模式返回这个包工头实例
*/
public LabourMarket(RegisterMarket registerMarket) {
this.registerMarket = registerMarket;
this.buildHouse = BuildHourseFactory.getSomeOne(registerMarket);
}
public void Building() {
if (buildHouse == null) System.err.println("没这号人~~~躺在空指针的血泊中..");
System.out.println(buildHouse.打地基() + "\n" + buildHouse.垒砖());
}
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:39
* @Desc: 根据客户选的人产生这个人盖房子对象(工厂模式)
*/
private static final class BuildHourseFactory {
public static BuildHouse getSomeOne(RegisterMarket market) {
if (market == null) return null;
switch (market) {
case 张三:
System.out.println("我张三举世无双");
return new 包工头张三();
case 李四:
System.out.println("我李四登峰造极");
return new 包工头张三();
default:
return null;
}
}
}
}
5、最后main方法:
/**
* @Auther: liuzujie
* @Date: 2020/4/29 20:43
* @Desc: 我要盖房子,我是客户,我要去劳务市场找个合适的包工头。
*/
public class Client {
public static void main(String[] args) {
//到了市场后找个包工头给我建房子(客户只需要确定包工头就行了,其他都交给门面)
LabourMarket market = new LabourMarket(RegisterMarket.李四);
market.Building();
}
}