什么是设计模式?
设计模式是一种可重复使用的解决方案。软件开发的祖先将总结开发过程中遇到的问题,并给出解决方案。当年轻一代遇到类似的问题时,他们可以使用这些解决方案来解决问题。(从设计模式可以看出,祖先对接口的应用。
? 单例模式(ps:参考https://www.cnblogs.com/xiaofengwang/p/11255678.html)
一类只有一个实例对象。这个对象的构造器是private所以不能在其他地方修改new,只能通过getInstance()获取实例。
单例模式的几种写法(还有其他的写法):
○ 懒汉风格(加上synchronized 线程安全的关键字。
1 public class Singleton 2 { 3 private static Singleton instance; 4 private Singleton(){} 5 public static synchronized Singleton getInstance(){ 6 if(instance == null){ 7 instance = new Singleton(); 8 } 9 return instance; 10 } 11 }
○ 饿汉式
public class Singleton { private static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return instance; } }
○ 双检查锁(不仅可以避免线程安全问题,还可以防止反序列化重建对象。
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
? 观察者模式:
观察者设计模式定义了一对多的关系。一个对象 A 与多个对象 B、C、D 建立观察与观察关系。当对象 A 当状态发生变化时,将通知所有观察者 B、 C、 D。当B、C、D 在接收到 A 状态变更通知后,根据自身实际情况做出相应变更。通常观察者和观察者都是接口,上述对象是指实现这些接口的对象。
观察者接口:
package com.bzw.observer; public interface Observer { ///接到通知后,应具体处理 void handleNotify(String message); }
观察者接口:
package com.bzw.observer; public interface ToBeObservered { public void addObserver(Observer observer); public void removeObserver(Observer observer); public void notifyObserver(String message); }
创建观察者:
package com.bzw.observer; public class ObserverA implements Observer{ @Override public void handleNotify(String message) { System.out.println(message "A正在处理通知"); } } package com.bzw.observer; public class ObserverB implements Observer{ @Override public void handleNotify(String message) { System.out.println(message "B正在处理通知"); } }
创建被观察者:
package com.bzw.observer; import java.util.ArrayList; import java.util.List; public class Observered implements ToBeObservered{ List observers = new ArrayList<>(); @Override public void addObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObserver(String message) { for(Observer o : observers) { o.handleNotify(message); } } }
测试类:
package com.bzw.observer; public class ObserverTest { public static void main(String args[]) { ObserverA xiaowang = new ObserverA(); ObserverB xiaoli = new ObserverB(); Observered beauty = new Observered(); beauty.addObserver(xiaowang); beauty.addObserver(xiaoli); beauty.notifyObserver("快来呀"); // System.out.println("----------------------"); // beauty.removeObserver(xiaoli); // beauty.notifyObserver("再来呀"); } }
? 装饰者模式
在扩展对象功能时,可以考虑装饰模式。
优点:无需修改被修改对象的源代码,装饰者与被装饰者耦合度不高。
package com.bzw.decorate; /** * * 面条装饰器 * */ public interface NoodleDecorate { public void addThings(); }
package com.bzw.decorate;
public class Noodle implements NoodleDecorate{
/**
* 普通拉面
*/
@Override
public void addThings() {
System.out.println("两片牛肉");
System.out.println("一根胡萝卜");
System.out.println("三根香菜");
}
}