桥接模式
将抽象部分与他的实现部分分离,使他们都可以独立地变化
实现指的是抽象类和他的派生类用来实现自己的对象
就像不同牌子的手机,会有不同的功能,要是抽象手机,然后逐个添加功能,很多功能大家都有,但也有一些特殊的。把功能也抽象出来。 尽量使用合成/聚合,尽量不要使用类继承。将手机软件传入手机类。因为针对抽象接口编程。直接调用抽象定义的方法。
//手机软件抽象类
abstract class HandSetSoft{
public abstract void Run();
}
//手机软件具体类
class HandSetGame extends HandSetSoft{
@Override
public void Run() {
// TODO Auto-generated method stub
System.out.println("运行手机游戏");
}
}
class HandSetAddressList extends HandSetSoft{
@Override
public void Run() {
// TODO Auto-generated method stub
System.out.println("运行手机通讯录");
}
}
//手机品牌类
abstract class HandSetBrand{
HandSetSoft soft;
public void SetHandSetSoft(HandSetSoft soft){
this.soft = soft;
}
public void Run(){
soft.Run();
}
}
//具体手机
class HandSetBrandN extends HandSetBrand{
@Override
public void Run(){
System.out.println("我是N牌手机");
super.Run();
}
}
class HandSetBrandM extends HandSetBrand{
@Override
public void Run(){
System.out.println("我是M牌手机");
super.Run();
}
}
客户端
public static void main(String[] args) {
HandSetBrandN n = new HandSetBrandN();
n.SetHandSetSoft(new HandSetGame());
n.Run();
n.SetHandSetSoft(new HandSetAddressList());
n.Run();
HandSetBrandM m = new HandSetBrandM();
m.SetHandSetSoft(new HandSetGame());
m.Run();
用书上的手机例子不是很好。现在的软件一般直接就可以用。不分手机品牌了~
命令模式
让行为请求者与行为实现者解耦合
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
就像开一个烧烤店,不可能厨师来接待你,然后一个一个烤。要一个服务员来传递命令,也就是点餐。
先定义一个厨师
//厨师
class Barbecuer{
//烤羊肉串
public void BakeMutton(){
System.out.println("厨师烤羊肉串");
}
//烤鸡腿
public void BakeChickenWing(){
System.out.println("厨师烤鸡腿鸡腿");
}
}
对厨师下达的命令进行抽象,然后具体的继承类就是烤什么
//抽象命令
abstract class Command{
Barbecuer receiverBarbecuer;
public Command (Barbecuer reBarbecuer){
this.receiverBarbecuer = reBarbecuer;
}
//执行命令
abstract public void ExcuteCommand();
}
具体烧烤
重写了toString方法,用来判断点的烧烤还有没了
//具体命令类
//烤羊肉串
class BakeMuttonCommand extends Command{
public BakeMuttonCommand(Barbecuer reBarbecuer) {
super(reBarbecuer);
// TODO Auto-generated constructor stub
}
@Override
public void ExcuteCommand() {
// TODO Auto-generated method stub
receiverBarbecuer.BakeMutton();
}
@Override
public String toString(){
return "BakeMuttonCommand";
}
}
//烤鸡腿
class BakeChickenWing extends Command{
public BakeChickenWing(Barbecuer reBarbecuer) {
super(reBarbecuer);
// TODO Auto-generated constructor stub
}
@Override
public void ExcuteCommand() {
// TODO Auto-generated method stub
receiverBarbecuer.BakeChickenWing();
}
@Override
public String toString(){
return "BakeChickenWing";
}
}
再定义个服务员
//服务员
class Waiter{
private List<Command> orders = new ArrayList<Command>();
//设置订单
public void SetOrder(Command command){
if(command.toString()=="BakeChickenWing"){
System.out.println("抱歉,没有鸡腿了");
}
else{
orders.add(command);
System.out.println("增加订单:"+command.toString());
}
}
public void CancelOrder(Command command){
orders.remove(command);
System.out.println("取消订单:"+command.toString());
}
//通知厨师订单
public void Notify(){
for(Command command :orders){
command.ExcuteCommand();
}
}
}
客户端
//先说明谁做烧烤,命令接受者
Barbecuer boyBarbecuer = new Barbecuer();
Command bakeMuttonCommand = new BakeMuttonCommand(boyBarbecuer);
Command backChickWingCommand = new BakeChickenWing(boyBarbecuer);
Waiter girl = new Waiter();
//点餐
girl.SetOrder(backChickWingCommand);
girl.SetOrder(bakeMuttonCommand);
girl.SetOrder(bakeMuttonCommand);
girl.Notify();
定义个命令接受者,抽象命令,命令的构造函数传入命令接受者。接受者执行命令。
定义命令传达者。进行List来增删命令和判断,传达调用命令。
命令传达者接受客户端传入的命令。执行。
嗯,3月底没有将设计模式看完。原因很多。但就是没看完。要加油了。
那天很开心。谢谢老师。