设计模式学习
面向对象设计原则:
1.单一职责
一个类的功能单一,不该做的不做
2.开放-封闭
对于完成的类,尽量不要修改,如果有需求,可以扩展。对于修改关闭,对于扩展开放
3.依赖到转
细节依赖于抽象,抽象不依赖细节。为了高内聚,低耦合(面向接口编程)
4.里氏替换
子类可以完全替换父类使用。
5.迪米特法则
如果两个类需要直接交互,就通过第三者来进行交互。低耦合
工厂模式Factory:
用于对象封装。需要一个抽象工厂,当用户有需要东西,只需把特征(区别点)告诉工厂,工厂就创建相应的东西。
public class BmwX5Car extends Car {public BmwX5Car() {}}public class BmwX7Car extends Car {public BmwX7Car() {}}public class SimpleCarFactory {// 简单工厂public Car createCar(String type) {if ("bmwx5".equals(type)) {return new BmwX5Car();} else if ("bmwx7".equals(type)) {return new BmwX7Car();} elsereturn null;}}public interface Strategy {boolean isPrime();}public class Miller implements Strategy {public boolean isPrime() {boolean result = false;System.out.println("这里是用来写Miller策略获取结果!");return result;}}public class Fermat implements Strategy {public boolean isPrime() {boolean result = false;System.out.println("这里是用来写Fermat策略获取结果!");return result;}}public class Primality {private Strategy strategy; // 私有的接口public Primality(Strategy s) {strategy = s;}public boolean run(int n) {return strategy.isPrime();}}public class TestStrategy {public static void main(String[] args) {Primality prime = null;int n = 1;Character ch = 'm';switch (ch) {case 'l':case 'L':prime = new Primality(new Miller());break;case 'm':case 'M':prime = new Primality(new Fermat());break;}}}public abstract class Car { String name = "Unknow Car"; public String getName() { return this.name; } public abstract float cost(); } // 标准型 BMW 汽车 public class BmwCar extends Car { public BmwCar() { this.name = "BMW"; } @Override public float cost() { return 50 * 10000.00f; } } // 标准 QQ 汽车 public class QQCar extends Car { public QQCar() { this.name = "QQ"; } @Override public float cost() { return 3 * 10000.00f; } } // 配件装饰者 public abstract class AccesoryDecorator extends Car { public abstract String getName(); } // 安全气囊配件 public class AirbagAccesory extends AccesoryDecorator { private Car car; public AirbagAccesory(Car car) { this.car = car; } @Override public String getName() { return car.getName() + ",Airbag"; } @Override public float cost() { return car.cost() + 1500; } } // 摄像头配件 public class CameraAccesory extends AccesoryDecorator { private Car car; public CameraAccesory(Car car) { this.car = car; } @Override public String getName() { return car.getName() + ",Camera"; } @Override public float cost() { return car.cost() + 800; } } // 测试程序 public static void main(String[] args) { Car car1 = new AirbagAccesory(new CameraAccesory(new QQCar())); printCarInfo(car1); Car car2 = new AirbagAccesory(new CameraAccesory(new BmwCar())); printCarInfo(car2); } public static void printCarInfo(Car car) { System.out.println("Car Name:" + car.getName() + ",Cost:"+ car.cost()); } // 电源 public class Power { public void connect() { System.out.println("The power is connected."); } public void disconnect() { System.out.println("The power is disconnected."); } } // 主板 public class MainBoard { public void on() { System.out.println("The mainboard is on."); } public void off() { System.out.println("The mainboard is off."); } } // 计算机外观 public class Computer { private Power power; private MainBoard board; public Computer(Power power, MainBoard board) { this.power = power; this.board = board; } public void startup() { this.power.connect(); this.board.on(); } public void shutdown() { this.board.off(); this.power.disconnect(); } }// 导游public abstract class Guide {public final void leadTour() {this.buyTickets();if (needRest()) {// 钩子this.bookingHotel();}this.visit();this.getBack();}// 购买旅行票public abstract void buyTickets();// 预定旅店public abstract void bookingHotel();// 参观public void visit() {System.out.println("Visit the scenic spot.");}// 返回public abstract void getBack();// 是否需要住宿public boolean needRest() {return true;}}public class BeiJingGuide extends Guide {@Overridepublic void buyTickets() {System.out.println("Buy bus tickets.");}@Overridepublic void bookingHotel() {// 因为不需要住宿,所以这里什么都不做}@Overridepublic void getBack() {System.out.println("Get back by bus.");}// 覆盖钩子,取消住宿@Overridepublic boolean needRest() {return false;}}public class HaiNanGuide extends Guide {@Overridepublic void buyTickets() {System.out.println("Buy plane tickets.");}@Overridepublic void bookingHotel() {System.out.println("Booking HaiNan Hotel.");}@Overridepublic void getBack() {System.out.println("Get back by air.");}}// 博客public interface Subject {public void addObserver(Observer observer);public void removeObserver(Observer observer);public void notifyObservers();}interface Observer {public void update(String blog);}class Blogger implements Subject {private List<Observer> observers;private String blog;public Blogger() {observers = new ArrayList<Observer>();}public void addObserver(Observer observer) {observers.add(observer);}public void removeObserver(Observer observer) {observers.remove(observer);}public void notifyObservers() {for (Observer o : observers) {o.update(blog);}}// 发表新博客文章public void writeNewBlog(String blog) {this.blog = blog;notifyObservers();}}// 邮件订阅者public class EmailSubscriber implements Observer {public void update(String blog) {// 发送电子邮件}}// RSS 订阅者public class RssSubscriber implements Observer {public void update(String email) {// 更新 RSS 信息}}public abstract class State{int type;public void setType(int t){type = t;} public abstract void doSomething();}public class Angry extends State{public void doSomething(){if(type > 0){System.out.println("I'm angry!");} else {new Happy().doSomething();} }}public class Happy extends State{ public void doSomething(){if(type < 0){System.out.println("I'm happy!");} else {new Angry().doSomething();} }}public static void main(String[] ss){State happy = new Happy();happy.setType(-1);happy.doSomething();}public interface IMenu {// 取得名称public String getName();// 显示public void display();// 添加菜单public void addItem(IMenu menu);}public class Menu implements IMenu {private List<IMenu> items = new ArrayList<IMenu>();private String name;public Menu(String name) {this.name = name;}public void addItem(IMenu menu) {items.add(menu);}public void display() {System.out.println(this.name + ":Menu");for (IMenu menu : items) {menu.display();}}public String getName() {return this.name;}}public class MenuItem implements IMenu {private String name;public MenuItem(String name) {this.name = name;}public void display() {System.out.println(this.name + ":MenuItem");}public String getName() {return this.name;}public void addItem(IMenu menu) {throw new UnsupportedOperationException();}}public class MenuBar {private List<IMenu> menus = new ArrayList<IMenu>();public void addMenu(IMenu menu) {this.menus.add(menu);}public void display() {System.out.println(":MenuBar");for (IMenu menu : menus) {menu.display();}}}public class Singleton {private volatile static Singleton instance;private Singleton() {}public static Singleton getInstance() {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}return instance;}}public class Mp3Player {public void playMusic() {System.out.println("Music is playing.");}public void stopMusic() {System.out.println("Music is stopped.");}}public interface Command {public void execute();public void undo();}public class PlayMusicCommand implements Command {private Mp3Player player;public PlayMusicCommand(Mp3Player p) {this.player = p;}public void execute() {this.player.playMusic();}public void undo() {this.player.stopMusic();}}// 停止音乐命令public class StopMusicCommand implements Command {private Mp3Player player;public StopMusicCommand(Mp3Player p) {this.player = p;}public void execute() {this.player.stopMusic();}public void undo() {this.player.playMusic();}}public class NoCommand implements Command {public void execute() {};public void undo() {};}public class remoteControl{private Command[] cm;private Command preCM;public remoteControl(){ cm = new Command[3]; for(int i =0;i< 3;i++){ cm[i] = new NoCommand(); }}public void setCommand(int index, Command c) {cm[index] = c;}public void doCommond(int index){cm[index].execute();preCM = cm[index];}public void cancleCommond(int index){preCM.undo();}}