这里写自定义目录标题
设计模式
策略模式
模拟鸭子项目
优惠券发放项目
Demo地址:github地址.
用OO原则解决新需求的不足:
策略模式优点:
策略模式注意点:
1.分析项目中变化部分与不变部分。
public void Quacck(){
System.out.println("gaga~");
}
public abstract void display();
public void swim(){
System.out.println("I can swim~");
}
public void fly(){
System.out.println("I can fly~");
}
上述代码中鸭子类游泳是不变的部分,但是鸭子叫声quecck有的是gaga叫,有的是gege叫。对于飞行fly,有的鸭子会飞有的鸭子不会飞。
所以使用接口加行为类组合的方式来实现。
飞行行为实现示例:
public interface FlyBehavior {
void fly();
}
public class GoodFlyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("**I can fly**");
}
}
public class BadFlyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("**I can't fly**");
}
}
观察者模式
Internet气象站项目
任务状态流转变更项目
通常的设计方案:
存在问题:
观察者模式:
装饰者模式
咖啡馆订单项目
一个差的方案:
装饰者模式有优点:动态地将新功能附加到对象上。在对象功能拓展方面,它比继承更有弹性。
咖啡类别与调料分开,调用费用方法时使用递归,加多种调料的费用也可以轻易算出。
单例模式
public class Singleton {
private static volatile Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
synchronized (Singleton.class) {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}
工厂模式
将对象实例化部分抽象出来单独处理和设计 。
把主要功能放在抽象工厂接口里,然后通过工厂族来实现这些功能。
原有OrderPizza类:每加一种pizza类型就会多一个if判断。
抽象工厂模式下:
把if判断代码放在
public class LDFactory implements AbsFactory{
@Override
public Pizza CreatePizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("cheese")){
pizza = new LDCheesePizza();
} else if (orderType.equals("pepper")) {
pizza = new LDPepperPizza();
}
return pizza;
}
}
do部分代码得到简化
do {
orderType = getType();
pizza = absFactory.CreatePizza(orderType);
if(pizza!=null){
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
}while(true);
适配器模式
将一个类的接口转换成另一种接口。让原来接口不兼容的类可以兼容。
public class TurkeyAdapter implements Duck {
private Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
for (int i = 0; i < 3; i++) {
turkey.fly();
}
}
}
外观模式
提供一个统一的接口,来访问子系统中一群功能相关接口。
最小知识原则:尽量减少对象之间的交互。
模板模式
封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现。
迭代器模式
提供一种方法顺序访问一个聚合对象中的各个对象。
组合模式
状态模式
根据状态打印任务流转
项目路径:com.java.State.task
能根据内部状态的变化,改变对象的行为,看起来好像修改了类。
赢家内部的dispense方法根据设定可以获得两枚糖果。
代理模式
为一个对象提供一个替身,以控制对这个对象的访问。被代理的对象可以是远程对象、创建开销大的对象,或需要安全控制的对象。
代理模式有很多变天,都是为了控制与管理对象访问。
远程代理:远程对象的本地代表,通过它可以让远程对象当本地对象来调用。远程代理通过网络和真正的远程对象沟通信息。
Java RMI
几种常见的代理模式
虚拟代理:
动态代理:
运行时动态地创建代理类对象,并将方法调用转发到指定类。