diff --git a/.gitignore b/.gitignore index 19ee72f..cc75bdd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ .gitignore build/ .settings/* +/out/ +*.iml +/.idea/ diff --git a/lib/asm-9.5.jar b/lib/asm-9.5.jar new file mode 100644 index 0000000..f5701dc Binary files /dev/null and b/lib/asm-9.5.jar differ diff --git a/lib/cglib-3.3.0.jar b/lib/cglib-3.3.0.jar new file mode 100644 index 0000000..ed830f4 Binary files /dev/null and b/lib/cglib-3.3.0.jar differ diff --git a/src/basic/Fibonacci.java b/src/basic/Fibonacci.java new file mode 100644 index 0000000..2af7411 --- /dev/null +++ b/src/basic/Fibonacci.java @@ -0,0 +1,39 @@ +package basic; + +import java.util.Arrays; + +/** + * 斐波那契数列 + * @author tanghuan + * @date 2024年11月29日 + */ +public class Fibonacci { + + public static void main(String[] args) { + long start = System.currentTimeMillis(); + long fibonacci = getFibonacci(100); + long end = System.currentTimeMillis(); + System.out.println("耗时:"+(end-start)/1000+"结果:"+fibonacci); + } + + public static long getFibonacci(int n) { + if (n < 1) { + return -1; + } + if (n == 1 || n == 2) { + return 1; + } + + long[] arr = new long[n]; + arr[0] = arr[1] = 1; //第一个和第二个数据特殊处理 + for (int i = 2; i < n; i++) { + arr[i] = arr[i -2] + arr[i - 1]; + } + + //可以得到整个的数列数据 仅n>2 + System.out.println("数组内容:" + Arrays.toString(arr)); + + return arr[n - 1]; + } + +} diff --git a/src/designpattern/adapter/Adaptee.java b/src/designpattern/adapter/Adaptee.java index f5a8e4b..a1c79a3 100644 --- a/src/designpattern/adapter/Adaptee.java +++ b/src/designpattern/adapter/Adaptee.java @@ -6,7 +6,7 @@ * @author liu yuning * */ -public class Adaptee { +public class Adaptee { public void specificRequest() { System.out.println("特殊的请求!"); diff --git a/src/designpattern/adapter/Adapter.java b/src/designpattern/adapter/Adapter.java index c562675..90f62ef 100644 --- a/src/designpattern/adapter/Adapter.java +++ b/src/designpattern/adapter/Adapter.java @@ -7,10 +7,13 @@ * */ public class Adapter extends Target { - private Adaptee adaptee = new Adaptee(); + private Adaptee adaptee; + public Adapter(Adaptee adaptee){ + this.adaptee=adaptee; + } @Override public void request() { - adaptee.specificRequest(); + adaptee.specificRequest(); } } diff --git a/src/designpattern/adapter/AdapterClient.java b/src/designpattern/adapter/AdapterClient.java index 4e65e9f..f5a6d2f 100644 --- a/src/designpattern/adapter/AdapterClient.java +++ b/src/designpattern/adapter/AdapterClient.java @@ -1,17 +1,26 @@ package designpattern.adapter; +import com.sun.xml.internal.messaging.saaj.util.ByteInputStream; +import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; + +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; + /** - * 适配器客户端 - * - * @author liu yuning + * 适配器模式用于将不兼容的接口适配到客户端所需要的接口。 * + * @author liu yuning */ public class AdapterClient { public static void main(String[] args) { - Target target; - - target = new Adapter(); - target.request(); + //字节流转字符流 + new ByteInputStream(); + new InputStreamReader(new ByteInputStream()); + new OutputStreamWriter(new ByteOutputStream()); + Target target; + Adaptee adaptee = new Adaptee(); + target = new Adapter(adaptee); + target.request(); } } diff --git a/src/designpattern/bridge/Abstraction.java b/src/designpattern/bridge/Abstraction.java index a180a7c..3df03fe 100644 --- a/src/designpattern/bridge/Abstraction.java +++ b/src/designpattern/bridge/Abstraction.java @@ -17,10 +17,7 @@ public void setImplementor(Implementor implementor) { this.implementor = implementor; } - public void operation() { - System.out.print("Abstraction-" + this.getName() + ": "); - implementor.operation(); - } + public abstract void operation(); public String getName() { return name; @@ -39,7 +36,8 @@ public AbstractionA(String name) { @Override public void operation() { - super.operation(); + System.out.print("AbstractionA-" + this.getName() + ": "); + this.implementor.operation(); } } @@ -52,7 +50,8 @@ public AbstractionB(String name) { @Override public void operation() { - super.operation(); + System.out.print("AbstractionB-" + this.getName() + ": "); + this.implementor.operation(); } } diff --git a/src/designpattern/bridge/BridgeClient.java b/src/designpattern/bridge/BridgeClient.java index 0c676f5..0797221 100644 --- a/src/designpattern/bridge/BridgeClient.java +++ b/src/designpattern/bridge/BridgeClient.java @@ -1,7 +1,7 @@ package designpattern.bridge; /** - * 客户端 + * 用于解耦抽象与实现,使其独立变化,通常用于需要支持多维度变化的场景。 * * @author liu yuning * diff --git a/src/designpattern/command/CommandClient.java b/src/designpattern/command/CommandClient.java index 61ce53f..002cde2 100644 --- a/src/designpattern/command/CommandClient.java +++ b/src/designpattern/command/CommandClient.java @@ -5,12 +5,15 @@ /** * 创建一个具体命令对象并设定它的接收者 + * + * 将请求封装成一个对象,使得可以用不同的请求来参数化其他对象,同时也支持撤销操作。 * * @author liu yuning * */ public class CommandClient { + public static void main(String[] args) { List recievers = new ArrayList(); @@ -20,9 +23,10 @@ public static void main(String[] args) { Command command = new ConcreteCommand(recievers); Invoker invoker = new Invoker(); - + recievers.remove(0); invoker.setCommand(command); invoker.executeCommand(); + command.execute(); } diff --git a/src/designpattern/composite/CompositeClient.java b/src/designpattern/composite/CompositeClient.java index 9e3295b..8ee56cd 100644 --- a/src/designpattern/composite/CompositeClient.java +++ b/src/designpattern/composite/CompositeClient.java @@ -1,7 +1,7 @@ package designpattern.composite; /** - * 客户端。通过Component接口操作组合部件的对象 + * 组合模式:用于处理树形结构,将单个对象和组合对象统一处理。 * * @author liu yuning * diff --git a/src/designpattern/decorator/Component.java b/src/designpattern/decorator/Component.java index 5c80106..15526be 100644 --- a/src/designpattern/decorator/Component.java +++ b/src/designpattern/decorator/Component.java @@ -6,6 +6,6 @@ * @author liu yuning * */ -public abstract class Component { - public abstract void operation(); +public interface Component { + public void operation(); } diff --git a/src/designpattern/decorator/ConcreteComponent.java b/src/designpattern/decorator/ConcreteComponent.java index 24399da..95d5e75 100644 --- a/src/designpattern/decorator/ConcreteComponent.java +++ b/src/designpattern/decorator/ConcreteComponent.java @@ -6,7 +6,7 @@ * @author liu yuning * */ -public class ConcreteComponent extends Component { +public class ConcreteComponent implements Component { @Override public void operation() { diff --git a/src/designpattern/decorator/Decorator.java b/src/designpattern/decorator/Decorator.java index 17ea717..78f55bb 100644 --- a/src/designpattern/decorator/Decorator.java +++ b/src/designpattern/decorator/Decorator.java @@ -7,7 +7,7 @@ * @author liu yuning * */ -public abstract class Decorator extends Component { +public class Decorator implements Component { protected Component component; public Component getComponent() { diff --git a/src/designpattern/decorator/DecoratorClient.java b/src/designpattern/decorator/DecoratorClient.java index 797165c..e3b3013 100644 --- a/src/designpattern/decorator/DecoratorClient.java +++ b/src/designpattern/decorator/DecoratorClient.java @@ -1,7 +1,7 @@ package designpattern.decorator; /** - * 装饰模式客户端调用代码,装饰的过程更像是层层包装,用前面的对象装饰后面的对象 + * 用于动态地给对象添加额外的职责,增强功能,不改变原有对象。 * * @author liu yuning * diff --git a/src/designpattern/flyweight/FlyWeight.java b/src/designpattern/flyweight/FlyWeight.java index c10bd75..b9a632b 100644 --- a/src/designpattern/flyweight/FlyWeight.java +++ b/src/designpattern/flyweight/FlyWeight.java @@ -7,25 +7,33 @@ * */ public abstract class FlyWeight { - + protected String name; public abstract void operation(int extrinsicState); } class ConcreteFlyWeight extends FlyWeight { + public ConcreteFlyWeight(String name){ + System.out.println("初始化"+name); + super.name=name; + } @Override public void operation(int extrinsicState) { - System.out.println("具体FlyWeight:" + extrinsicState); + System.out.println(name+"具体FlyWeight:" + extrinsicState); } } class UnsharedConcreteFlyWeight extends FlyWeight { + public UnsharedConcreteFlyWeight(String name){ + System.out.println("初始化"+name); + super.name=name; + } @Override public void operation(int extrinsicState) { - System.out.println("不共享的具体FlyWeight:" + extrinsicState); + System.out.println(name+"不共享的具体FlyWeight:" + extrinsicState); } } \ No newline at end of file diff --git a/src/designpattern/flyweight/FlyWeightClient.java b/src/designpattern/flyweight/FlyWeightClient.java index 547d26b..b5236c7 100644 --- a/src/designpattern/flyweight/FlyWeightClient.java +++ b/src/designpattern/flyweight/FlyWeightClient.java @@ -2,27 +2,32 @@ /** * 客户端 - * - * @author liu yuning * + * @author liu yuning */ public class FlyWeightClient { public static void main(String[] args) { - int extrinsicState = 22; + int extrinsicState = 22; + + FlyWeightFactory f = new FlyWeightFactory(); + + FlyWeight fx = f.getFlyWeight("X"); + fx.operation(--extrinsicState); - FlyWeightFactory f = new FlyWeightFactory(); + FlyWeight fy = f.getFlyWeight("Y"); + fy.operation(--extrinsicState); - FlyWeight fx = f.getFlyWeight("X"); - fx.operation(--extrinsicState); + FlyWeight fy1 = f.getFlyWeight("Y"); + fy1.operation(--extrinsicState);//我们采用享元模式获取同类型对象只初始化一次 - FlyWeight fy = f.getFlyWeight("Y"); - fy.operation(--extrinsicState); + FlyWeight fz = f.getFlyWeight("Z"); + fz.operation(--extrinsicState); - FlyWeight fz = f.getFlyWeight("Z"); - fz.operation(--extrinsicState); + FlyWeight uf = new UnsharedConcreteFlyWeight("A"); + uf.operation(--extrinsicState); - FlyWeight uf = new UnsharedConcreteFlyWeight(); - uf.operation(--extrinsicState); + FlyWeight uf1 = new UnsharedConcreteFlyWeight("A"); + uf1.operation(--extrinsicState); } diff --git a/src/designpattern/flyweight/FlyWeightFactory.java b/src/designpattern/flyweight/FlyWeightFactory.java index afc235d..acbfe7f 100644 --- a/src/designpattern/flyweight/FlyWeightFactory.java +++ b/src/designpattern/flyweight/FlyWeightFactory.java @@ -13,7 +13,7 @@ public class FlyWeightFactory { public FlyWeight getFlyWeight(String key) { if (!flyWeights.containsKey(key)) { - flyWeights.put(key, new ConcreteFlyWeight()); + flyWeights.put(key, new ConcreteFlyWeight(key)); } return flyWeights.get(key); diff --git a/src/designpattern/interpreter/Context.java b/src/designpattern/interpreter/Context.java index 9494d50..741dc45 100644 --- a/src/designpattern/interpreter/Context.java +++ b/src/designpattern/interpreter/Context.java @@ -10,6 +10,15 @@ public class Context { private String input; private String output; + private Boolean isOnline; + + public Boolean getOnline() { + return isOnline; + } + + public void setOnline(Boolean online) { + isOnline = online; + } public String getInput() { return input; diff --git a/src/designpattern/interpreter/InterpreterClient.java b/src/designpattern/interpreter/InterpreterClient.java index 53d970e..e2813d9 100644 --- a/src/designpattern/interpreter/InterpreterClient.java +++ b/src/designpattern/interpreter/InterpreterClient.java @@ -22,7 +22,7 @@ public static void main(String[] args) { for (AbstractExpression expression : list) { expression.interpret(context); } - + System.out.println(context.getOutput()); } } diff --git a/src/designpattern/interpreter/NonTerminalExpression.java b/src/designpattern/interpreter/NonTerminalExpression.java index c5289cc..1739efe 100644 --- a/src/designpattern/interpreter/NonTerminalExpression.java +++ b/src/designpattern/interpreter/NonTerminalExpression.java @@ -2,15 +2,16 @@ /** * 非终结符表达式,为文法中的非终结符实现解释操作。对文法中每一条规则R1、R2 ... ... Rn都需要一个具体的非终结符表达式类。 - * - * @author liu yuning * + * @author liu yuning */ public class NonTerminalExpression extends AbstractExpression { @Override public void interpret(Context context) { - System.out.println("非终端解释器"); + context.setInput(context.getInput() + "\n非终端解释器,修炼轮海境"); + context.setOutput(context.getInput()); + System.out.println("非终端解释器"); } } diff --git a/src/designpattern/interpreter/TerminalExpression.java b/src/designpattern/interpreter/TerminalExpression.java index 9985c17..7925a17 100644 --- a/src/designpattern/interpreter/TerminalExpression.java +++ b/src/designpattern/interpreter/TerminalExpression.java @@ -2,15 +2,16 @@ /** * 实现与文法中的终结符相关联的解释操作,文法中每一个终结符都有一个具体终结表达式与之相对应 - * - * @author liu yuning * + * @author liu yuning */ public class TerminalExpression extends AbstractExpression { @Override public void interpret(Context context) { - System.out.println("终端解释器"); + context.setInput(context.getInput() + "\n终端解释器,修炼苦海境"); + context.setOutput(context.getInput()); + System.out.println("终端解释器"); } diff --git a/src/designpattern/iterator/IteratorClient.java b/src/designpattern/iterator/IteratorClient.java index dccddb9..8e59ab4 100644 --- a/src/designpattern/iterator/IteratorClient.java +++ b/src/designpattern/iterator/IteratorClient.java @@ -1,28 +1,62 @@ package designpattern.iterator; +import designpattern.interpreter.Context; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.ListIterator; + /** * 迭代器客户端 - * - * @author liu yuning * + * @author liu yuning */ public class IteratorClient { - public static void main(String[] args) { - ConcreteAggregate bus = new ConcreteAggregate(); - - bus.setItems("大鸟"); - bus.setItems("小菜"); - bus.setItems("行李"); - bus.setItems("老外"); - bus.setItems("公交内部员工"); - bus.setItems("小偷"); - - Iterator iterator = new ConcreteIterator(bus); - - while (!iterator.isDone()) { - System.out.println(iterator.currentItem() + "请买票!"); - iterator.next(); - } + public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + ConcreteAggregate bus = new ConcreteAggregate(); + bus.setItems("大鸟"); + bus.setItems("小菜"); + bus.setItems("行李"); + bus.setItems("老外"); + bus.setItems("公交内部员工"); + bus.setItems("小偷"); + + Iterator iterator = new ConcreteIterator(bus); + + while (!iterator.isDone()) { + System.out.println(iterator.currentItem() + "请买票!"); + iterator.next(); + } + + ArrayList objects = new ArrayList<>(); + objects.add("大鸟"); + objects.add("小菜"); + objects.add("行李"); + objects.add("老外"); + objects.add("公交内部员工"); + objects.add("小偷"); + ListIterator stringListIterator = objects.listIterator(); + + int count = 1; + while (stringListIterator.hasNext()) { + if (count == 3) { + stringListIterator.add("三三"); + stringListIterator.add("思思"); + } + count++; + String next = stringListIterator.next(); + System.out.println(next); + stringListIterator.remove(); + + } + System.out.println(">>>>>>>>"); + stringListIterator = objects.listIterator(); + while (stringListIterator.hasNext()) { + String next = stringListIterator.next(); + System.out.println(next); + + } + } } diff --git a/src/designpattern/memento/CareTaker.java b/src/designpattern/memento/CareTaker.java index e6eeed2..aaaef83 100644 --- a/src/designpattern/memento/CareTaker.java +++ b/src/designpattern/memento/CareTaker.java @@ -1,5 +1,9 @@ package designpattern.memento; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + /** * 管理者(CareTaker)类:管理备忘录 * @@ -8,14 +12,14 @@ */ public class CareTaker { - private Memento memento; + private Stack memento=new Stack<>(); - public Memento getMemento() { + public Stack getMemento() { return memento; } public void setMemento(Memento memento) { - this.memento = memento; + this.memento.push(memento) ; } } diff --git a/src/designpattern/memento/MementoClient.java b/src/designpattern/memento/MementoClient.java index 42e393e..71cc53d 100644 --- a/src/designpattern/memento/MementoClient.java +++ b/src/designpattern/memento/MementoClient.java @@ -15,7 +15,7 @@ public static void main(String[] args) { originator.show(); // 管理者通过备忘录保存状态,由于有了很好地封装,可以隐藏Originator的实现细节 - CareTaker careTaker = new CareTaker(); + CareTaker careTaker = new CareTaker();//其内部存储可以使用栈结构,存储更多的历史备忘 careTaker.setMemento(originator.createMemento()); // 改变状态 @@ -23,7 +23,7 @@ public static void main(String[] args) { originator.show(); // 通过管理者从备忘录中恢复状态 - originator.recoverMemento(careTaker.getMemento()); + originator.recoverMemento(careTaker.getMemento().pop()); originator.show(); } diff --git a/src/designpattern/observer/ConcreteSubject.java b/src/designpattern/observer/ConcreteSubject.java index 6f3054d..d616a4c 100644 --- a/src/designpattern/observer/ConcreteSubject.java +++ b/src/designpattern/observer/ConcreteSubject.java @@ -2,18 +2,18 @@ /** * 具体主题或通知者 - * - * @author liu yuning * + * @author liu yuning */ public class ConcreteSubject extends Subject { private String subjectState; public String getSubjectState() { - return subjectState; + return subjectState; } public void setSubjectState(String subjectState) { - this.subjectState = subjectState; + this.subjectState = subjectState;//状态变更 + super.notifyObserver();//通知 } } diff --git a/src/designpattern/observer/ObserverClient.java b/src/designpattern/observer/ObserverClient.java index 4613ff5..02484cc 100644 --- a/src/designpattern/observer/ObserverClient.java +++ b/src/designpattern/observer/ObserverClient.java @@ -2,21 +2,19 @@ /** * 观察者模式客户端代码 - * - * @author liu yuning * + * @author liu yuning */ public class ObserverClient { public static void main(String[] args) { - ConcreteSubject concreteSubject = new ConcreteSubject(); - - concreteSubject.attach(new ConcreteObserver(concreteSubject, "X")); - concreteSubject.attach(new ConcreteObserver(concreteSubject, "Y")); - concreteSubject.attach(new ConcreteObserver(concreteSubject, "Z")); + ConcreteSubject concreteSubject = new ConcreteSubject(); - concreteSubject.setSubjectState("ABC"); - concreteSubject.notifyObserver(); + concreteSubject.attach(new ConcreteObserver(concreteSubject, "X")); + concreteSubject.attach(new ConcreteObserver(concreteSubject, "Y")); + concreteSubject.attach(new ConcreteObserver(concreteSubject, "Z")); + concreteSubject.setSubjectState("ABC"); + concreteSubject.setSubjectState("tanghuan"); } } diff --git a/src/designpattern/observer/Subject.java b/src/designpattern/observer/Subject.java index 2fdd63e..b10b11f 100644 --- a/src/designpattern/observer/Subject.java +++ b/src/designpattern/observer/Subject.java @@ -9,7 +9,7 @@ * @author liu yuning * */ -public abstract class Subject { +public class Subject { private List observers = new ArrayList(); public void attach(Observer observer) { diff --git a/src/designpattern/prototype/PrototypeClient.java b/src/designpattern/prototype/PrototypeClient.java index ce628c0..2693e95 100644 --- a/src/designpattern/prototype/PrototypeClient.java +++ b/src/designpattern/prototype/PrototypeClient.java @@ -4,58 +4,62 @@ /** * 原型模式客户端 演示深度拷贝和浅度拷贝 - * - * @Todo 考虑优化此处的重复代码 - * @author liu yuning * + * @author liu yuning + * @Todo 考虑优化此处的重复代码 */ public class PrototypeClient { public static void shallowCopy() throws CloneNotSupportedException { - Resume aResume = new Resume(); - aResume.setName("大鸟 ").setGender("男 ").setAge(25); - aResume.setWorkExperience("1999-2002, ", "XX公司"); + Resume aResume = new Resume(); + aResume.setName("大鸟 ").setGender("男 ").setAge(25); + aResume.setWorkExperience("1999-2002, ", "XX公司"); + + Resume bResume = (Resume) aResume.clone(); + bResume.setName("黑鸟 ").setGender("女 ").setAge(27); - Resume bResume = (Resume) aResume.clone(); - bResume.setWorkExperience("1999-2002, ", "YY公司"); + bResume.setWorkExperience("1999-2002, ", "YY公司"); - Resume cResume = (Resume) aResume.clone(); - cResume.setWorkExperience("1999-2002, ", "ZZ公司"); + Resume cResume = (Resume) aResume.clone(); + cResume.setName("火鸟 ").setGender("女 ").setAge(28); + cResume.setWorkExperience("1999-2002, ", "ZZ公司"); - System.out.println(">>>>>>浅度拷贝:"); - aResume.display(); - bResume.display(); - cResume.display(); + System.out.println(">>>>>>浅度拷贝:"); + aResume.display(); + bResume.display(); + cResume.display(); } public static void deepCopy() throws CloneNotSupportedException, - ClassNotFoundException, IOException { - Resume aResume = new Resume(); - aResume.setName("大鸟 ").setGender("男 ").setAge(25); - aResume.setWorkExperience("1999-2002, ", "XX公司"); + ClassNotFoundException, IOException { + Resume aResume = new Resume(); + aResume.setName("大鸟 ").setGender("男 ").setAge(25); + aResume.setWorkExperience("1999-2002, ", "XX公司"); - Resume bResume = (Resume) aResume.deepClone(); - bResume.setWorkExperience("1999-2002, ", "YY公司"); + Resume bResume = (Resume) aResume.deepClone(); + bResume.setName("黑鸟 ").setGender("女 ").setAge(27); + bResume.setWorkExperience("1999-2002, ", "YY公司"); - Resume cResume = (Resume) aResume.deepClone(); - cResume.setWorkExperience("1999-2002, ", "ZZ公司"); + Resume cResume = (Resume) aResume.deepClone(); + cResume.setName("火鸟 ").setGender("女 ").setAge(28); + cResume.setWorkExperience("1999-2002, ", "ZZ公司"); - System.out.println(">>>>>>深度拷贝:"); - aResume.display(); - bResume.display(); - cResume.display(); + System.out.println(">>>>>>深度拷贝:"); + aResume.display(); + bResume.display(); + cResume.display(); } public static void main(String[] args) throws CloneNotSupportedException, - ClassNotFoundException, IOException { + ClassNotFoundException, IOException { - // 浅度拷贝 - shallowCopy(); + // 浅度拷贝 + shallowCopy(); - System.out.println("=================================="); + System.out.println("=================================="); - // 深度拷贝 - deepCopy(); + // 深度拷贝 + deepCopy(); } diff --git a/src/designpattern/prototype/Resume.java b/src/designpattern/prototype/Resume.java index 19a12e9..5dd98d1 100644 --- a/src/designpattern/prototype/Resume.java +++ b/src/designpattern/prototype/Resume.java @@ -43,14 +43,12 @@ protected Object clone() throws CloneNotSupportedException { // 通过对象序列化,实现深度拷贝 public Object deepClone() throws IOException, ClassNotFoundException { // 将对象写入流内 - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(this); - - // 从流内读出对象 - ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream( - bos.toByteArray())); - return ois.readObject(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(this); + // 从流内读出对象 + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); + return ois.readObject(); } diff --git a/src/designpattern/proxy/Proxy.java b/src/designpattern/proxy/Proxy.java index 29d3795..be558b2 100644 --- a/src/designpattern/proxy/Proxy.java +++ b/src/designpattern/proxy/Proxy.java @@ -11,13 +11,15 @@ public class Proxy implements Subject { // 保存一个引用,使得代理可以访问真实实体 Subject subject; - public Proxy() { - subject = new RealSubject(); + public Proxy(Subject realSubject) { + subject = realSubject; } @Override public void request() { - subject.request(); + System.out.println("Proxy:before operation"); + subject.request(); + System.out.println("Proxy:after operation"); } } diff --git a/src/designpattern/proxy/ProxyClient.java b/src/designpattern/proxy/ProxyClient.java index 84969e2..0de933c 100644 --- a/src/designpattern/proxy/ProxyClient.java +++ b/src/designpattern/proxy/ProxyClient.java @@ -2,13 +2,13 @@ /** * 代理客户端 - * - * @author liu yuning * + * @author liu yuning */ public class ProxyClient { public static void main(String[] args) { - Proxy proxy = new Proxy(); - proxy.request(); + RealSubject realSubject = new RealSubject(); + Proxy proxy = new Proxy(realSubject); + proxy.request(); } } diff --git a/src/designpattern/proxy/cglib/CglibProxy.java b/src/designpattern/proxy/cglib/CglibProxy.java new file mode 100644 index 0000000..8d174bc --- /dev/null +++ b/src/designpattern/proxy/cglib/CglibProxy.java @@ -0,0 +1,31 @@ +package designpattern.proxy.cglib; + +import net.sf.cglib.proxy.Enhancer; +import net.sf.cglib.proxy.MethodInterceptor; +import net.sf.cglib.proxy.MethodProxy; + +import java.lang.reflect.Method; + +/** + * cglib动态代理 + * + * @author tanghuan + * @date 2024年11月25日 + */ +public class CglibProxy implements MethodInterceptor { + private static Enhancer enhancer = new Enhancer(); + + public Object createProxy(Class clazz) { + enhancer.setSuperclass(clazz); + enhancer.setCallback(this); + return enhancer.create(); + } + + @Override + public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { + System.out.println("CglibProxy:before operation"); + Object result = methodProxy.invokeSuper(obj, objects); + System.out.println("CglibProxy:after operation"); + return result; + } +} diff --git a/src/designpattern/proxy/cglib/CglibProxyClient.java b/src/designpattern/proxy/cglib/CglibProxyClient.java new file mode 100644 index 0000000..1a6189e --- /dev/null +++ b/src/designpattern/proxy/cglib/CglibProxyClient.java @@ -0,0 +1,16 @@ +package designpattern.proxy.cglib; + +import designpattern.proxy.RealSubject; + +/** + * @author tanghuan + * @date 2024年11月25日 + */ +public class CglibProxyClient { + + public static void main(String[] args) { + RealSubject realSubject = new RealSubject(); + RealSubject proxy = (RealSubject)new CglibProxy().createProxy(realSubject.getClass()); + proxy.request(); + } +} diff --git a/src/designpattern/proxy/jdk/JdkProxy.java b/src/designpattern/proxy/jdk/JdkProxy.java new file mode 100644 index 0000000..e3773ed --- /dev/null +++ b/src/designpattern/proxy/jdk/JdkProxy.java @@ -0,0 +1,26 @@ +package designpattern.proxy.jdk; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +/** + * jdk动态代理 + * @author tanghuan + * @date 2024年11月25日 + */ +public class JdkProxy implements InvocationHandler { + + private Object target; + + public JdkProxy(Object target) { + this.target = target; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + System.out.println("JdkProxy:before operation"); + Object result = method.invoke(target, args); + System.out.println("JdkProxy:after operation"); + return result; + } +} diff --git a/src/designpattern/proxy/jdk/JdkProxyClient.java b/src/designpattern/proxy/jdk/JdkProxyClient.java new file mode 100644 index 0000000..fb53984 --- /dev/null +++ b/src/designpattern/proxy/jdk/JdkProxyClient.java @@ -0,0 +1,19 @@ +package designpattern.proxy.jdk; + +import designpattern.proxy.RealSubject; +import designpattern.proxy.Subject; + +import java.lang.reflect.Proxy; + +/** + * @author tanghuan + * @date 2024年11月25日 + */ +public class JdkProxyClient { + public static void main(String[] args) { + RealSubject realSubject = new RealSubject(); + JdkProxy jdkProxy = new JdkProxy(realSubject); + Subject subject = (Subject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), new Class[]{Subject.class}, jdkProxy); + subject.request(); + } +} diff --git a/src/designpattern/state/State.java b/src/designpattern/state/State.java index ed2f091..5bf054e 100644 --- a/src/designpattern/state/State.java +++ b/src/designpattern/state/State.java @@ -11,6 +11,9 @@ public abstract class State { } +/** + * 不同的状态做不同的事,并且控制状态流转 + */ class ConcreteStateA extends State { @Override diff --git a/src/designpattern/state/StateClient.java b/src/designpattern/state/StateClient.java index 407c091..6036580 100644 --- a/src/designpattern/state/StateClient.java +++ b/src/designpattern/state/StateClient.java @@ -2,19 +2,23 @@ /** * 客户端:不断请求,不断更改状态 - * - * @author liu yuning * + * @author liu yuning */ public class StateClient { public static void main(String[] args) { - Context context = new Context(new ConcreteStateA()); + Context context = new Context(new ConcreteStateA()); - context.request(); - context.request(); - context.request(); - context.request(); - context.request(); + context.request(); + context.request(); + context.request(); + context.request(); + context.request(); + context.request(); + context.request(); + context.request(); + context.request(); + context.request(); } } diff --git a/src/designpattern/strategy/Context.java b/src/designpattern/strategy/Context.java index f595c4e..c31e1bc 100644 --- a/src/designpattern/strategy/Context.java +++ b/src/designpattern/strategy/Context.java @@ -1,23 +1,31 @@ package designpattern.strategy; +import java.util.HashMap; +import java.util.Map; + /** * 上下文 - * - * @author liu yuning * + * @author liu yuning */ -public class Context { - Strategy strategy; +public class Context { + private static Map strategyMap=new HashMap<>(); - public Context(Strategy strategy) { - this.strategy = strategy; + static { + ConcreteStrategyA concreteStrategyA = new ConcreteStrategyA(); + ConcreteStrategyB concreteStrategyB = new ConcreteStrategyB(); + ConcreteStrategyC concreteStrategyC = new ConcreteStrategyC(); + strategyMap.put(concreteStrategyA.getType(), concreteStrategyA); + strategyMap.put(concreteStrategyB.getType(), concreteStrategyB); + strategyMap.put(concreteStrategyC.getType(), concreteStrategyB); } + /** * 上下文接口 */ - public void contextInterface() { - strategy.algorithmInterface(); + public static Strategy getStrategy(Integer type) { + return strategyMap.get(type); } } \ No newline at end of file diff --git a/src/designpattern/strategy/Strategy.java b/src/designpattern/strategy/Strategy.java index 372b99b..4f009ac 100644 --- a/src/designpattern/strategy/Strategy.java +++ b/src/designpattern/strategy/Strategy.java @@ -8,9 +8,15 @@ */ public interface Strategy { public void algorithmInterface(); + } class ConcreteStrategyA implements Strategy { + public Integer type=1; + + public Integer getType() { + return type; + } @Override public void algorithmInterface() { @@ -20,6 +26,11 @@ public void algorithmInterface() { } class ConcreteStrategyB implements Strategy { + public Integer type=2; + + public Integer getType() { + return type; + } @Override public void algorithmInterface() { @@ -29,6 +40,11 @@ public void algorithmInterface() { } class ConcreteStrategyC implements Strategy { + public Integer type=3; + + public Integer getType() { + return type; + } @Override public void algorithmInterface() { diff --git a/src/designpattern/strategy/StrategyClient.java b/src/designpattern/strategy/StrategyClient.java index acb7189..c746fb4 100644 --- a/src/designpattern/strategy/StrategyClient.java +++ b/src/designpattern/strategy/StrategyClient.java @@ -8,7 +8,7 @@ */ public class StrategyClient { public static void main(String[] args) { - Context context; + /*Context context; context = new Context(new ConcreteStrategyA()); context.contextInterface(); @@ -17,7 +17,15 @@ public static void main(String[] args) { context.contextInterface(); context = new Context(new ConcreteStrategyC()); - context.contextInterface(); + context.contextInterface();*/ + Strategy strategy = Context.getStrategy(1); + strategy.algorithmInterface(); + + strategy = Context.getStrategy(2); + strategy.algorithmInterface(); + + strategy = Context.getStrategy(3); + strategy.algorithmInterface(); - } + } } diff --git a/src/designpattern/visitor/TestAc.java b/src/designpattern/visitor/TestAc.java new file mode 100644 index 0000000..cd6df0f --- /dev/null +++ b/src/designpattern/visitor/TestAc.java @@ -0,0 +1,17 @@ +package designpattern.visitor; + +/** + * @author tanghuan + * @date 2024年11月20日 + */ +public class TestAc { + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/designpattern/visitor/VisitorClient.java b/src/designpattern/visitor/VisitorClient.java index b90d28c..039bf85 100644 --- a/src/designpattern/visitor/VisitorClient.java +++ b/src/designpattern/visitor/VisitorClient.java @@ -1,5 +1,8 @@ package designpattern.visitor; +import java.util.ArrayList; +import java.util.stream.Collectors; + /** * 客户端 * @@ -17,7 +20,20 @@ public static void main(String[] args) { ConcreteVisitor1 visitor1 = new ConcreteVisitor1(); ConcreteVisitor2 visitor2 = new ConcreteVisitor2(); + //在不改变元素的结构前提下,由访问者去实现对各元素的不同操作, o.accept(visitor1); o.accept(visitor2); - } + TestAc testAc1 = new TestAc(); + TestAc testAc2 = new TestAc(); + ArrayList objects = new ArrayList<>(); + objects.add(testAc1); + objects.add(testAc2); + objects.stream().map(object->{ + object.setName("sf"); + return object; + }).collect(Collectors.toList()); + for (TestAc object : objects) { + System.out.println(object.getName()); + } + } }