五一去旅游为例:
五一大家都去旅游,大家都选择不一样的出行方式。如:火车(K,G),飞机,汽车等。人也不一样,有Rich,Middle,Poor等三类人。
人(People):拥有去旅行的方法,如:go(String ticket);需要选择出行的方式:TripMode。
出行方式(TripMode):出行方式是独立的,所以定义成接口。不管如何出行,都需要这几个方法,买票(buyTicket),改签(meal),退票(refundTicket)等。
类图:
下面是代码:
TripMode接口
public interface TripMode {//出行方式
public String buyTicket(String from,String to);//买票
public String meal(String ticket,String oldData,String newData);//改签
public void refundTicket(String ticket);//退票
}
TripMode接口的实现类
public abstract class Train implements TripMode {//火车
}
public class KTrain extends Train {//K字头火车
@Override
public String buyTicket(String from, String to) {
return "已购票成功,车票信息:KXXX次列车,列车从"+from+"出发,开往"+to+",旅途开始";
}
@Override
public String meal(String ticket, String oldData, String newData) {
return "车票已改签,车票信息:KXXX次列车,出发时间由"+oldData+"改为"+newData+"";
}
@Override
public void refundTicket(String ticket) {
Log.e("zhang", "车票信息:KXXX次列车,已退票成功");
}
}
public class GTrain extends Train {//高铁
@Override
public String buyTicket(String from, String to) {
return "已购票成功,车次信息:GXXX次列车,本列车从"+from+"出发,开往"+to+",旅途开始";
}
@Override
public String meal(String ticket, String oldData, String newData) {
return "车票已改签,车次信息:GXXX次列车,出发时间由"+oldData+"改为"+newData+"";
}
@Override
public void refundTicket(String ticket) {
Log.e("zhang", "车次信息:GXXX次列车,已退票成功");
}
}
public class Automobile implements TripMode {//汽车
@Override
public String buyTicket(String from, String to) {
return "已购票成功,车票信息:XXX汽车,从"+from+"出发,开往"+to+",旅途开始";
}
@Override
public String meal(String ticket, String oldData, String newData) {
return "车票已改签,车票信息:XXX汽车,出发时间由"+oldData+"改为"+newData+"";
}
@Override
public void refundTicket(String ticket) {
Log.e("zhang", "车票信息:XXX汽车,已退票成功");
}
}
public class Aircraft implements TripMode{//飞机
@Override
public String buyTicket(String from, String to) {
return "已购票成功,机票信息:XXX航班,从"+from+"出发,飞往"+to+",旅途开始";
}
@Override
public String meal(String ticket, String oldData, String newData) {
return "机票已改签,机票信息:XXX航班,出发时间由"+oldData+"改为"+newData+"";
}
@Override
public void refundTicket(String ticket) {
Log.e("zhang", "机票信息:XXX航班,已退票成功");
}
}
People抽象类
public abstract class People {
protected TripMode mode;//出行方式
public People() {
mode = new KTrain();//默认做K字头火车
}
public abstract void go(String ticket);//每个人都有去旅行的方法
public TripMode getMode() {
return mode;
}
public void setMode(TripMode mode) {
this.mode = mode;
}
public String buyTicket(String from, String to) {//代理的方式,调用买票的方法
if (null != mode && !TextUtils.isEmpty(from) && !TextUtils.isEmpty(to)) {
return mode.buyTicket(from, to);
}
return null;
}
public String meal(String ticket, String oldData, String newData) {//代理的方式,调用买票的方法
if (null != mode && !TextUtils.isEmpty(ticket) && !TextUtils.isEmpty(oldData) && !TextUtils.isEmpty(newData)) {
return mode.meal(ticket, oldData, newData);
}
return null;
}
public void refundTicket(String ticket) {//代理的方式,调用买票的方法
if (null != mode && !TextUtils.isEmpty(ticket)) {
mode.refundTicket(ticket);
}
}
}
People的实现类
public class RichPeople extends People {
@Override
public void go(String ticket) {
Log.e("zhang", "我是土豪,"+ticket);
}
}
public class MiddlePeople extends People {
@Override
public void go(String ticket) {
Log.e("zhang", "我是MiddlePeople,"+ticket);
}
}
public class PoorPeople extends People {
@Override
public void go(String ticket) {
Log.e("zhang", "我是PoorPeople,"+ticket);
}
}
代码入口(以android的MainActivity为入口):
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
People people = new RichPeople();
people.setMode(new Aircraft());
String ticket = people.buyTicket("上海", "马尔代夫");
ticket = people.meal(ticket, "上午9点", "下午2点");
people.go(ticket);
people = new MiddlePeople();
people.setMode(new GTrain());
String ticket1 = people.buyTicket("上海", "海口");
people.go(ticket1);
people = new PoorPeople();
String ticket2 = people.buyTicket("上海", "杭州");
ticket2 = people.meal(ticket2, "上午9点", "下午3点");
people.refundTicket(ticket2);
}
}