参考地址:https://www.runoob.com/design-pattern/design-pattern-tutorial.html
工厂模式
package com.up.designpatterns.factory;/*** @description: 工厂模式* @author: huilong.ding* @date: 2024/03/28 16:36**/
public class factory {public static void main(String[] args) {ShapeFactory shapeFactory = new ShapeFactory();//获取 Circle 的对象,并调用它的 draw 方法Shape shape1 = shapeFactory.getShape("CIRCLE");//调用 Circle 的 draw 方法shape1.draw();//获取 Rectangle 的对象,并调用它的 draw 方法Shape shape2 = shapeFactory.getShape("RECTANGLE");//调用 Rectangle 的 draw 方法shape2.draw();//获取 Square 的对象,并调用它的 draw 方法Shape shape3 = shapeFactory.getShape("SQUARE");//调用 Square 的 draw 方法shape3.draw();}}interface Shape {void draw();
}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}class Square implements Shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}
}class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}class ShapeFactory {//使用 getShape 方法获取形状类型的对象public Shape getShape(String shapeType){if(shapeType == null){return null;}if(shapeType.equalsIgnoreCase("CIRCLE")){return new Circle();} else if(shapeType.equalsIgnoreCase("RECTANGLE")){return new Rectangle();} else if(shapeType.equalsIgnoreCase("SQUARE")){return new Square();}return null;}
}
抽象工厂模式
package com.up.designpatterns.abstractfactory;/*** @description: 抽象工厂* @author: huilong.ding* @date: 2024/03/28 17:02**/
public class AbstractFactoryDemo {
}/*为形状创建一个接口。*/interface Shape {void draw();
}
//draw步骤 2
// 创建实现接口的实体类。
//
// Rectangle.java
//
// Rectangle.java
class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}class Square implements Shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}
}class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}
//步骤 3
// 为颜色创建一个接口。
//
// Color.java
interface Color {void fill();
}
//步骤4
// 创建实现接口的实体类。
//
// Red.java
class Red implements Color {@Overridepublic void fill() {System.out.println("Inside Red::fill() method.");}
}class Green implements Color {@Overridepublic void fill() {System.out.println("Inside Green::fill() method.");}
}class Blue implements Color {@Overridepublic void fill() {System.out.println("Inside Blue::fill() method.");}
}
//步骤 5
// 为 Color 和 Shape 对象创建抽象类来获取工厂。
//
// AbstractFactory.java
abstract class AbstractFactory {public abstract Color getColor(String color);public abstract Shape getShape(String shape);
}
//步骤 6
// 创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。
//
// ShapeFactory.java
class ShapeFactory extends AbstractFactory {@Overridepublic Shape getShape(String shapeType){if(shapeType == null){return null;}if(shapeType.equalsIgnoreCase("CIRCLE")){return new Circle();} else if(shapeType.equalsIgnoreCase("RECTANGLE")){return new Rectangle();} else if(shapeType.equalsIgnoreCase("SQUARE")){return new Square();}return null;}@Overridepublic Color getColor(String color) {return null;}
}class ColorFactory extends AbstractFactory {@Overridepublic Shape getShape(String shapeType){return null;}@Overridepublic Color getColor(String color) {if(color == null){return null;}if(color.equalsIgnoreCase("RED")){return new Red();} else if(color.equalsIgnoreCase("GREEN")){return new Green();} else if(color.equalsIgnoreCase("BLUE")){return new Blue();}return null;}
}
//步骤 7
// 创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。
//
// FactoryProducer.java
class FactoryProducer {public static AbstractFactory getFactory(String choice){if(choice.equalsIgnoreCase("SHAPE")){return new ShapeFactory();} else if(choice.equalsIgnoreCase("COLOR")){return new ColorFactory();}return null;}
}
//步骤 8
// 使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象。
//
// AbstractFactoryPatternDemo.java
class AbstractFactoryPatternDemo {public static void main(String[] args) {//获取形状工厂AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");//获取形状为 Circle 的对象Shape shape1 = shapeFactory.getShape("CIRCLE");//调用 Circle 的 draw 方法shape1.draw();//获取形状为 Rectangle 的对象Shape shape2 = shapeFactory.getShape("RECTANGLE");//调用 Rectangle 的 draw 方法shape2.draw();//获取形状为 Square 的对象Shape shape3 = shapeFactory.getShape("SQUARE");//调用 Square 的 draw 方法shape3.draw();//获取颜色工厂AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");//获取颜色为 Red 的对象Color color1 = colorFactory.getColor("RED");//调用 Red 的 fill 方法color1.fill();//获取颜色为 Green 的对象Color color2 = colorFactory.getColor("GREEN");//调用 Green 的 fill 方法color2.fill();//获取颜色为 Blue 的对象Color color3 = colorFactory.getColor("BLUE");//调用 Blue 的 fill 方法color3.fill();}
}
策略模式
package com.up.designpatterns.strategy;/*** @description: 策略模式* @author: huilong.ding* @date: 2024/03/28 14:42**/
public class StrategyPatternDemo {public static void main(String[] args) {// 加法;System.out.println(new Context(new OperationAdd()).executeStrategy(5, 6));// 减法;System.out.println(new Context(new OperationSubtract()).executeStrategy(5, 6));}
}interface Strategy {public int doOperation(int num1, int num2);
}class OperationAdd implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}class OperationSubtract implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int num1, int num2) {return this.strategy.doOperation(num1, num2);}
}
观察者模式
package com.up.designpatterns.observer;import java.util.ArrayList;
import java.util.List;/*** @description: 观察者模式* @author: huilong.ding* @date: 2024/03/28 11:57**/public class ObserverDemo{public static void main(String[] args) {// 使用观察者模式循环打印a,b,c各10次;Subject subject = new Subject();new OneObserver(subject);new TwoObserver(subject);new ThreeObserver(subject);for (int i = 0; i < 10; i++) {subject.setState(i+1);}}}class Subject {protected List<Observer> observers =new ArrayList<>();private int state;public int getState() {return state;}public void setState(int state) {this.state = state;notifyAllObservers();}public void attach(Observer observer) {observers.add(observer);}public void notifyAllObservers(){for (Observer observer : observers) {observer.update();}}
}abstract class Observer {protected Subject subject;public abstract void update();
}class OneObserver extends Observer {public OneObserver(Subject subject) {this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println("a + " + this.subject.getState());}
}class TwoObserver extends Observer {public TwoObserver(Subject subject) {this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println("b + " + this.subject.getState());}
}class ThreeObserver extends Observer {public ThreeObserver(Subject subject) {this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println("c + " + this.subject.getState());}
}
单例模式
package com.up.designpatterns.singleton;/*** @description: 单例模式* @author: huilong.ding* @date: 2024/04/01 17:11**/
public class singletonDemo {public static void main(String[] args) {//不合法的构造函数//编译时错误:构造函数 SingleObject() 是不可见的//SingleObject object = new SingleObject();//获取唯一可用的对象SingleObject object = SingleObject.getInstance();//显示消息object.showMessage();}}class SingleObject{//创建 SingleObject 的一个对象private static SingleObject instance = new SingleObject();//让构造函数为 private,这样该类就不会被实例化private SingleObject(){}//获取唯一可用的对象public static SingleObject getInstance(){return instance;}public void showMessage(){System.out.println("Hello World!");}}
建造者模式
package com.up.designpatterns.builder;import java.util.ArrayList;
import java.util.List;/*** @description: 建造者模式* @author: huilong.ding* @date: 2024/04/01 17:41**/
//步骤 1
// 创建一个表示食物条目和食物包装的接口。
//
// Item.java
interface Item {public String name();public Packing packing();public float price();
}
//Packing.javainterface Packing {public String pack();
}
//步骤 2
// 创建实现 Packing 接口的实体类。
//
// Wrapper.javaclass Wrapper implements Packing {@Overridepublic String pack() {return "Wrapper";}
}
//Bottle.javaclass Bottle implements Packing {@Overridepublic String pack() {return "Bottle";}
}
//步骤 3
// 创建实现 Item 接口的抽象类,该类提供了默认的功能。
//
// Burger.javaabstract class Burger implements Item {@Overridepublic Packing packing() {return new Wrapper();}@Overridepublic abstract float price();
}
//ColdDrink.javaabstract class ColdDrink implements Item {@Overridepublic Packing packing() {return new Bottle();}@Overridepublic abstract float price();
}
//步骤 4
// 创建扩展了 Burger 和 ColdDrink 的实体类。
//
// VegBurger.javaclass VegBurger extends Burger {@Overridepublic float price() {return 25.0f;}@Overridepublic String name() {return "Veg Burger";}
}
//ChickenBurger.javaclass ChickenBurger extends Burger {@Overridepublic float price() {return 50.5f;}@Overridepublic String name() {return "Chicken Burger";}
}
//Coke.javaclass Coke extends ColdDrink {@Overridepublic float price() {return 30.0f;}@Overridepublic String name() {return "Coke";}
}
//Pepsi.javaclass Pepsi extends ColdDrink {@Overridepublic float price() {return 35.0f;}@Overridepublic String name() {return "Pepsi";}
}
//步骤 5
// 创建一个 Meal 类,带有上面定义的 Item 对象。
//
// Meal.javaclass Meal {private List<Item> items = new ArrayList<Item>();public void addItem(Item item){items.add(item);}public float getCost(){float cost = 0.0f;for (Item item : items) {cost += item.price();}return cost;}public void showItems(){for (Item item : items) {System.out.print("Item : "+item.name());System.out.print(", Packing : "+item.packing().pack());System.out.println(", Price : "+item.price());}}
}
//步骤 6
// 创建一个 MealBuilder 类,实际的 builder 类负责创建 Meal 对象。
//
// MealBuilder.javaclass MealBuilder {public Meal prepareVegMeal (){Meal meal = new Meal();meal.addItem(new VegBurger());meal.addItem(new Coke());return meal;}public Meal prepareNonVegMeal (){Meal meal = new Meal();meal.addItem(new ChickenBurger());meal.addItem(new Pepsi());return meal;}
}
//步骤 7
// BuiderPatternDemo 使用 MealBuilder 来演示建造者模式(Builder Pattern)。
//
// BuilderPatternDemo.javaclass BuilderDemo {public static void main(String[] args) {MealBuilder mealBuilder = new MealBuilder();Meal vegMeal = mealBuilder.prepareVegMeal();System.out.println("Veg Meal");vegMeal.showItems();System.out.println("Total Cost: " +vegMeal.getCost());Meal nonVegMeal = mealBuilder.prepareNonVegMeal();System.out.println("\n\nNon-Veg Meal");nonVegMeal.showItems();System.out.println("Total Cost: " +nonVegMeal.getCost());}
}
适配器模式
package com.up.designpatterns.adapter;/*** @description: 适配器模式* @author: huilong.ding* @date: 2024/04/01 20:07**/
//步骤 1
// 为媒体播放器和更高级的媒体播放器创建接口。
//
// MediaPlayer.javainterface MediaPlayer {public void play(String audioType, String fileName);
}
//AdvancedMediaPlayer.javainterface AdvancedMediaPlayer {public void playVlc(String fileName);public void playMp4(String fileName);
}
//步骤 2
// 创建实现了 AdvancedMediaPlayer 接口的实体类。
//
// VlcPlayer.javaclass VlcPlayer implements AdvancedMediaPlayer{@Overridepublic void playVlc(String fileName) {System.out.println("Playing vlc file. Name: "+ fileName);}@Overridepublic void playMp4(String fileName) {//什么也不做}
}
//Mp4Player.javaclass Mp4Player implements AdvancedMediaPlayer{@Overridepublic void playVlc(String fileName) {//什么也不做}@Overridepublic void playMp4(String fileName) {System.out.println("Playing mp4 file. Name: "+ fileName);}
}
//步骤 3
// 创建实现了 MediaPlayer 接口的适配器类。
//
// MediaAdapter.javaclass MediaAdapter implements MediaPlayer {AdvancedMediaPlayer advancedMusicPlayer;public MediaAdapter(String audioType){if(audioType.equalsIgnoreCase("vlc") ){advancedMusicPlayer = new VlcPlayer();} else if (audioType.equalsIgnoreCase("mp4")){advancedMusicPlayer = new Mp4Player();}}@Overridepublic void play(String audioType, String fileName) {if(audioType.equalsIgnoreCase("vlc")){advancedMusicPlayer.playVlc(fileName);}else if(audioType.equalsIgnoreCase("mp4")){advancedMusicPlayer.playMp4(fileName);}}
}
//步骤 4
// 创建实现了 MediaPlayer 接口的实体类。
//
// AudioPlayer.javaclass AudioPlayer implements MediaPlayer {MediaAdapter mediaAdapter;@Overridepublic void play(String audioType, String fileName) {//播放 mp3 音乐文件的内置支持if(audioType.equalsIgnoreCase("mp3")){System.out.println("Playing mp3 file. Name: "+ fileName);}//mediaAdapter 提供了播放其他文件格式的支持else if(audioType.equalsIgnoreCase("vlc")|| audioType.equalsIgnoreCase("mp4")){mediaAdapter = new MediaAdapter(audioType);mediaAdapter.play(audioType, fileName);}else{System.out.println("Invalid media. "+audioType + " format not supported");}}
}
//步骤 5
// 使用 AudioPlayer 来播放不同类型的音频格式。
//
// AdapterPatternDemo.java
public class AdapterPatternDemo {public static void main(String[] args) {AudioPlayer audioPlayer = new AudioPlayer();audioPlayer.play("mp3", "beyond the horizon.mp3");audioPlayer.play("mp4", "alone.mp4");audioPlayer.play("vlc", "far far away.vlc");audioPlayer.play("avi", "mind me.avi");}
}
责任链模式
package com.up.designpatterns.chain;/*** @description: 责任链模式* @author: huilong.ding* @date: 2024/04/01 20:24**/
//步骤 1
// 创建抽象的记录器类。abstract class AbstractLogger {public static int INFO = 1;public static int DEBUG = 2;public static int ERROR = 3;protected int level;//责任链中的下一个元素protected AbstractLogger nextLogger;public void setNextLogger(AbstractLogger nextLogger){this.nextLogger = nextLogger;}public void logMessage(int level, String message){if(this.level <= level){write(message);}if(nextLogger !=null){nextLogger.logMessage(level, message);}}abstract protected void write(String message);}
//步骤 2
// 创建扩展了该记录器类的实体类。class ConsoleLogger extends AbstractLogger {public ConsoleLogger(int level){this.level = level;}@Overrideprotected void write(String message) {System.out.println("Standard Console::Logger: " + message);}
}class ErrorLogger extends AbstractLogger {public ErrorLogger(int level){this.level = level;}@Overrideprotected void write(String message) {System.out.println("Error Console::Logger: " + message);}
}class FileLogger extends AbstractLogger {public FileLogger(int level){this.level = level;}@Overrideprotected void write(String message) {System.out.println("File::Logger: " + message);}
}
//步骤 3
// 创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。
//
// ChainPatternDemo.java
public class ChainPatternDemo {private static AbstractLogger getChainOfLoggers(){AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);errorLogger.setNextLogger(fileLogger);fileLogger.setNextLogger(consoleLogger);return errorLogger;}public static void main(String[] args) {AbstractLogger loggerChain = getChainOfLoggers();loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");loggerChain.logMessage(AbstractLogger.DEBUG,"This is a debug level information.");loggerChain.logMessage(AbstractLogger.ERROR,"This is an error information.");}
}
过滤器模式/标准模式
package com.up.designpatterns.criteriapattern;import java.util.ArrayList;
import java.util.List;/*** @description: 过滤器模式/标准模式* @author: huilong.ding* @date: 2024/04/01 17:52**/
//步骤 1
// 创建一个类,在该类上应用标准。class Person {private String name;private String gender;private String maritalStatus;public Person(String name,String gender,String maritalStatus){this.name = name;this.gender = gender;this.maritalStatus = maritalStatus;}public String getName() {return name;}public String getGender() {return gender;}public String getMaritalStatus() {return maritalStatus;}
}
//步骤 2
// 为标准(Criteria)创建一个接口。interface Criteria {public List<Person> meetCriteria(List<Person> persons);
}
//步骤 3
// 创建实现了 Criteria 接口的实体类。class CriteriaMale implements Criteria {@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> malePersons = new ArrayList<Person>();for (Person person : persons) {if(person.getGender().equalsIgnoreCase("MALE")){malePersons.add(person);}}return malePersons;}
}class CriteriaFemale implements Criteria {@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> femalePersons = new ArrayList<Person>();for (Person person : persons) {if(person.getGender().equalsIgnoreCase("FEMALE")){femalePersons.add(person);}}return femalePersons;}
}class CriteriaSingle implements Criteria {@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> singlePersons = new ArrayList<Person>();for (Person person : persons) {if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){singlePersons.add(person);}}return singlePersons;}
}
//AndCriteria.javaclass AndCriteria implements Criteria {private Criteria criteria;private Criteria otherCriteria;public AndCriteria(Criteria criteria, Criteria otherCriteria) {this.criteria = criteria;this.otherCriteria = otherCriteria;}@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);return otherCriteria.meetCriteria(firstCriteriaPersons);}
}
//OrCriteria.java
// import java.util.List;class OrCriteria implements Criteria {private Criteria criteria;private Criteria otherCriteria;public OrCriteria(Criteria criteria, Criteria otherCriteria) {this.criteria = criteria;this.otherCriteria = otherCriteria;}@Overridepublic List<Person> meetCriteria(List<Person> persons) {List<Person> firstCriteriaItems = criteria.meetCriteria(persons);List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);for (Person person : otherCriteriaItems) {if(!firstCriteriaItems.contains(person)){firstCriteriaItems.add(person);}}return firstCriteriaItems;}
}
//步骤4
// 使用不同的标准(Criteria)和它们的结合来过滤 Person 对象的列表。
public class CriteriaPatternDemo {public static void main(String[] args) {List<Person> persons = new ArrayList<Person>();persons.add(new Person("Robert","Male", "Single"));persons.add(new Person("John","Male", "Married"));persons.add(new Person("Laura","Female", "Married"));persons.add(new Person("Diana","Female", "Single"));persons.add(new Person("Mike","Male", "Single"));persons.add(new Person("Bobby","Male", "Single"));Criteria male = new CriteriaMale();Criteria female = new CriteriaFemale();Criteria single = new CriteriaSingle();Criteria singleMale = new AndCriteria(single, male);Criteria singleOrFemale = new OrCriteria(single, female);System.out.println("Males: ");printPersons(male.meetCriteria(persons));System.out.println("\nFemales: ");printPersons(female.meetCriteria(persons));System.out.println("\nSingle Males: ");printPersons(singleMale.meetCriteria(persons));System.out.println("\nSingle Or Females: ");printPersons(singleOrFemale.meetCriteria(persons));}public static void printPersons(List<Person> persons){for (Person person : persons) {System.out.println("Person : [ Name : " + person.getName()+", Gender : " + person.getGender()+", Marital Status : " + person.getMaritalStatus()+" ]");}}
}