[1.抽象工厂]

代码:

public class AbstractFactory { public static void main(String[] args) { Factory factory1 = new Factory1();
 
 
   ProductA productA = factory1.createProductA();
    productA.info();

    Factory factory2 = new Factory2();

    ProductB productB = factory2.createProductB();
    productB.info();
}
 
 
}
interface Factory { public ProductA createProductA(); public ProductB createProductB(); }
class Factory1 implements Factory {
 
 
@Override
public ProductA createProductA() {
    return new ProductA1();
}

@Override
public ProductB createProductB() {
    return new ProductB1();
}
 
 
}
class Factory2 implements Factory {
 
 
@Override
public ProductA createProductA() {
    return new ProductA2();
}

@Override
public ProductB createProductB() {
    return new ProductB2();
}
 
 
}
interface ProductA { public void info(); }
[2.生成器模式]

代码:

import java.util.*;
public class Main { public static void main(String[] args) { Director director = new Director();
 
 
   Builder builder1 = new Builder1();
    director.Construct(builder1);
    Product product1 = builder1.getResult();
    product1.show();

    Builder builder2 = new Builder2();
    director.Construct(builder2);
    Product product2 = builder2.getResult();
    product2.show();
}
 
 
}
class Director { public void Construct(Builder builder) { builder.BuildPart(); } }
abstract class Builder { public abstract void BuildPart(); public abstract Product getResult(); }
class Builder1 extends Builder { Product product = new Product();
 
 
@Override
public void BuildPart() {
    product.Add("A");
    product.Add("B");
    product.Add("C");
    product.Add("D");
    product.Add("E");
    product.Add("F");
}

@Override
public Product getResult() {
    return product;
}
 
 
}
class Builder2 extends Builder { Product product = new Product();
 
 
@Override
public void BuildPart() {
    product.Add("A");
    product.Add("B");
    product.Add("C");
}

@Override
public Product getResult() {
    return product;
}
 
 
}
class Product { List parts = new ArrayList();
 
 
public void Add(String part) {
    parts.add(part);
}

public void show() {
    System.out.print("产品的组成:");
    for (String s : parts)
        System.out.print(s + " ");

    System.out.print("\n");
}
 
 
}
[3.原型模式]

代码:

public class Main { public static void main(String[] args) { Product product1 = new Product(2022, 5.28); System.out.println(product1.getId() + " " + product1.getPrice());
 
 
   // Product product2 = new Product(2022, 5.28);
    Product product2 = (Product) product1.Clone();
    System.out.println(product2.getId() + " " + product2.getPrice());

    Product product3 = (Product) product1.Clone();
    System.out.println(product3.getId() + " " + product3.getPrice());
}
 
 
}
interface Prototype { public Object Clone(); }
class Product implements Prototype { private int id; private double price;
 
 
public Product() {}

public Product(int id, double price) {
    this.id = id;
    this.price = price;
}

public int getId() {
    return id;
}

public double getPrice() {
    return price;
}

@Override
public Object Clone() {
    Product object = new Product();
    object.id = this.id;
    object.price = this.price;

    return object;
}
 
 
}
[4.适配器]

代码:

public class AdapterPattern { public static void main(String[] args) { USB usb = new Adapter(); usb.Request(); } }
class USB { public void Request() { System.out.println("USB数据线"); } }
class Adapter extends USB { private TypeC typeC = new TypeC();
 
 
@Override
public void Request() {
    typeC.SpecificRequest();
}
 
 
}
class TypeC { public void SpecificRequest() { System.out.println("Type-C数据线"); } }
[5.桥接模式]

代码:

public class BridgePattern { public static void main(String[] args) { Product productA1 = new ProductA(); Product productA2 = new ProductA(); Color red = new Red();
 
 
productA1.setName("产品A1");
    productA1.setColor(red);
    productA1.Operation();


    Blue blue = new Blue();
    productA2.setName("产品A2");
    productA2.setColor(blue);
    productA2.Operation();
}
 
 
}
abstract class Product { private String name; protected Color color;
 
 
public void setName(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void setColor(Color color) {
    this.color = color;
}

public abstract void Operation();
 
 
}
class ProductA extends Product {
 
 
@Override
public void Operation() {
    color.OperationImp(this.getName());
}
 
 
}
interface Color { public void OperationImp(String name); }
class Red implements Color {
 
 
@Override
public void OperationImp(String name) {
    System.out.println(name + ":红色");
}
 
 
}
class Blue implements Color {
 
 
@Override
public void OperationImp(String name) {
    System.out.println(name + ":蓝色");
}
 
 
}
[6.组合]

代码:

import java.util.*;
public class CompositePattern { public static void main(String[] args) { // 父类名 对象名 = new 子类名(); AbstractFile root = new Folder("root");
 
 
AbstractFile folderA = new Folder("folderA");
    AbstractFile folderB = new Folder("folderB");

    AbstractFile fileC = new File("fileC");
    AbstractFile fileD = new File("fileD");
    AbstractFile fileE = new File("fileE");

    root.Add(folderA);
    root.Add(folderB);
    root.Add(fileC);

    folderA.Add(fileD);
    folderA.Add(fileE);

    print(root);
}

static void print(AbstractFile file) {
    file.printName();

    List<AbstractFile> childrenList = file.getChildren();
    if (childrenList == null) return;

    // for (对象类型 对象名 : 遍历对象)
    for (AbstractFile children : childrenList) {
        // children.printName();
        print(children);
    }
}
 
 
}
abstract class AbstractFile { protected String name;
 
 
public void printName() {
    System.out.println(name);
}

public abstract boolean Add(AbstractFile file);
public abstract boolean Remove(AbstractFile file);
public abstract List<AbstractFile> getChildren();
 
 
}
class Folder extends AbstractFile { private List childrenList = new ArrayList();
 
 
public Folder(String name) {
    this.name = name;
}

@Override
public boolean Add(AbstractFile file) {
    return childrenList.add(file);
}

@Override
public boolean Remove(AbstractFile file) {
    return childrenList.remove(file);
}

@Override
public List<AbstractFile> getChildren() {
    return childrenList;
}
 
 
}
class File extends AbstractFile { public File(String name) { this.name = name; }
 
 
@Override
public boolean Add(AbstractFile file) {
    return false;
}

@Override
public boolean Remove(AbstractFile file) {
    return false;
}

@Override
public List<AbstractFile> getChildren() {
    return null;
}
 
 
}
[7.装饰器]
public class DecoratorPattern { public static void main(String[] args) { Person zhangsan = new Student("张三"); zhangsan = new DecoratorA(zhangsan); zhangsan = new DecoratorB(zhangsan); zhangsan.Operation();
 
 
System.out.println("\n=====我是分割线=====");

    // 对象链
    Person lisi = new DecoratorB(new DecoratorA(new Student("李四")));
}
 
 
}
abstract class Decorator extends Person { protected Person person; }
class DecoratorA extends Decorator { public DecoratorA(Person person) { this.person = person; }
 
 
@Override
public void Operation() { // 职责
    person.Operation(); // 原本的职责
    System.out.print("写作业 ");
}
 
 
}
class DecoratorB extends Decorator { public DecoratorB(Person person) { this.person = person; }
 
 
@Override
public void Operation() { // 职责
    person.Operation(); // 原本的职责
    System.out.print("考试 ");
}
 
 
}
abstract class Person { protected String name;
 
 
public abstract void Operation(); // 职责
 
 
}
class Student extends Person { public Student(String name) { this.name = name; }
 
 
@Override
public void Operation() {
    System.out.print(name + "的职责:学习 ");
}
 
 
}
[8.享元模式]

代码:

import java.util.*;
public class FlyWeightPattern { public static void main(String[] args) { ShapeFactory factory = new ShapeFactory();
 
 
Random random = new Random();
    String[] colors = {"red", "blue", "green", "white", "black"};

    for (int i = 1; i <= 100; i ++ ) {
        int x = random.nextInt(colors.length); // [0 ~ 4]
        Shape shape = factory.getShape(colors[x]);

        System.out.print("第" + i + "个圆:");
        shape.draw(random.nextInt(2022), random.nextInt(528));
    }
}
 
 
}
class ShapeFactory { private Map<String, Shape> map = new HashMap<String, Shape>();
 
 
public Shape getShape(String key) {
    if (!map.containsKey(key)) {
        map.put(key, new Circle(key));
        System.out.println("create color:" + key + " circle");
    }

    return map.get(key);
}
 
 
}
abstract class Shape { protected String color;
 
 
public abstract void draw(int x, int y);
 
 
}
class Circle extends Shape { public Circle(String color) { this.color = color; }
 
 
@Override
public void draw(int x, int y) {
    System.out.println("draw a color:" + color + " circle x:" + x + " y:" + y);
}
 
 
}
[9.命令模式]

代码:

public class CommandPattern { public static void main(String[] args) { Tv tv = new Tv(); // 接收者 对象 电视机
 
 
Command onCommand = new OnCommand(tv); // 命令对象 开机命令
    Command offCommand = new OffCommand(tv); // 命令对象 关机命令

    Invoker invoker = new Invoker(); // 请求者
    invoker.setCommand(onCommand); // 给请求者设置 开机 命令
    invoker.call(); // 请求者去请求命令

    System.out.println("========================================");

    invoker.setCommand(offCommand); // 给请求者设置 关机命令
    invoker.call(); // 请求者去请求命令
}
 
 
}
class Invoker { // 请求者 private Command command; // 命令
 
 
public void setCommand(Command command) { // 设置请求者 的 请求的命令
    this.command = command;
}

public void call() { // 调用
    command.Execute();
}
 
 
}
interface Command { // 命令接口 public void Execute(); // 执行命令 }
class OnCommand implements Command { // 开机命令 private Tv tv;
 
 
public OnCommand(Tv tv) {
    this.tv = tv;
}

@Override
public void Execute() {
    tv.OnAction();
}
 
 
}
class OffCommand implements Command { // 关机命令 private Tv tv;
 
 
public OffCommand(Tv tv) {
    this.tv = tv;
}

@Override
public void Execute() {
    tv.OffAction();
}
 
 
}
class Tv { // 接收者 电视机 public void OnAction() { // 开机行为 System.out.println("电视机开机了..."); }
 
 
public void OffAction() { // 关机行为
    System.out.println("电视机关机了...");
}
 
 
}
[10.观察者]

代码:

import java.util.*;
public class ObserverPattern { public static void main(String[] args) { Subject subjectA = new ConcreteSubject("目标A");
 
 
Observer observerB = new ConcreteObserver("张三", subjectA);
    Observer observerC = new ConcreteObserver("李四", subjectA);
    Observer observerD = new ConcreteObserver("王五", subjectA);

    subjectA.setState("更新了");

    System.out.println("======================================");

    subjectA.Detach(observerD);

    subjectA.setState("停更了");
}
 
 
}
interface Subject { // 目标 public void Attach(Observer observer); // 添加观察者 public void Detach(Observer observer); // 删除观察者 public void Notify(); // 状态改变后 通知所有观察者
 
 
public void setState(String state); // 设置状态(改变状态)
public String getState(); // 获取状态
 
 
}
class ConcreteSubject implements Subject { private String name; private String state;
 
 
private List<Observer> observerList;

public ConcreteSubject(String name) {
    state = "未更新";
    this.name = name;

    observerList = new ArrayList<Observer>();
}

public void setState(String state) {
    this.state = state;

    System.out.println(name + "的状态发生变化,变化后的状态为:" + state);
    Notify();
}

public String getState() {
    return state;
}

public void Attach(Observer observer) {
    observerList.add(observer);
}

public void Detach(Observer observer) {
    observerList.remove(observer);
}

public void Notify() {
    // for (遍历对象类型 对象名 : 遍历对象)
    for (Observer observer : observerList) {
        observer.update();
    }
}
 
 
}
interface Observer { // 观察者接口 public void update(); // 收到通知 更新观察者的状态 }
class ConcreteObserver implements Observer { private String name; private String state;
 
 
private Subject subject;

public ConcreteObserver(String name, Subject subject) {
    this.name = name;

    this.subject = subject;
    subject.Attach(this);

    state = subject.getState();
}

@Override
public void update() {
    System.out.println(name + "收到通知");
    state = subject.getState(); // 让当前观察者的状态 和 改变了状态之后的目标的状态保持一致

    System.out.println(name + "改变后的状态为:" + state);
}
 
 
}
[11.状态]

代码:

public class StatePattern { public static void main(String[] args) { Context context = new Context(); // count:3
 
 
System.out.println(context.getState());

    context.Request(); // 购买一个饮料 count = 2
    context.Request(); // 购买一个饮料 count = 1
    context.Request(); // 购买一个饮料 count = 0

    System.out.println(context.getState());

    context.Request(); // 无货 等待补货 补货成功 count = 5

    System.out.println(context.getState());

    context.Request(); // 购买一个饮料 count = 4
    System.out.println(context.getCount());

}
 
 
}
class Context { // 贩卖机 private int count;
 
 
private State state;

public Context() {
    count = 3;
    state = new StateA();
}

public int getCount() {
    return count;
}

public void setCount(int count) {
    this.count = count;
}

public State getState() {
    return state;
}

public void setState(State state) {
    this.state = state;
}

public void Request() { // 购买一个饮料
    state.Handle(this);
}
 
 
}
interface State { public void Handle(Context context); }
class StateA implements State { // 有货
 
 
@Override
public void Handle(Context context) {
    int count = context.getCount();

    if (count >= 1) {
        System.out.println("购买成功!");
        context.setCount(count - 1);

        if (context.getCount() == 0) {
            context.setState(new StateB());
        }
    } else {
        System.out.println("购买失败!");
    }
}
 
 
}
class StateB implements State { // 无货
 
 
@Override
public void Handle(Context context) {
    int count = context.getCount();

    if (count == 0) {
        System.out.println("购买失败!等待补货");

        context.setCount(5);
        System.out.println("补货成功,请重新购买");
        context.setState(new StateA());
    }
}
 
 
}
[12.策略]

代码:

public class StrategyPattern { public static void main(String[] args) { Strategy add = new AddStrategy(); Strategy subtraction = new SubtractionStrategy(); Strategy multiply = new MultiplyStrategy();
 
 
OperationContext context = new OperationContext(add);
    context.Operation(2022, 528);

    context = new OperationContext(subtraction);
    context.Operation(2022, 528);

    context = new OperationContext(multiply);
    context.Operation(2022, 528);
}
 
 
}
class OperationContext { private Strategy strategy;
 
 
public OperationContext(Strategy strategy) {
    this.strategy = strategy;
}

public void Operation(int a, int b) {
    strategy.TwoNumberOperation(a, b);
}
 
 
}
interface Strategy { public void TwoNumberOperation(int a, int b); }
class AddStrategy implements Strategy {
 
 
@Override
public void TwoNumberOperation(int a, int b) {
    System.out.println(a + b);
}
 
 
}
class SubtractionStrategy implements Strategy {
 
 
@Override
public void TwoNumberOperation(int a, int b) {
    System.out.println(a - b);
}
 
 
}
class MultiplyStrategy implements Strategy {
 
 
@Override
public void TwoNumberOperation(int a, int b) {
    System.out.println(a * b);
}
 
 
}
[13.访问者]

代码:

import java.util.*;
public class VisitorPattern { public static void main(String[] args) { PersonStructure structure = new PersonStructure();
 
 
Visitor1 visitor1 = new Visitor1();
    System.out.println("访问者1的访问记录:");
    structure.Accept(visitor1);
    System.out.println("学生年龄的总和:" + visitor1.getStudentAgeSum() + " 老师年龄的总和:" + visitor1.getTeacherAgeSum());

    System.out.println("=========================================");

    Visitor2 visitor2 = new Visitor2();
    System.out.println("访问者2的访问记录:");
    structure.Accept(visitor2);
    System.out.println("学生的最高成绩:" + visitor2.getMaxScore() + " 老师的最高工龄:" + visitor2.getMaxWorkYear());
}
 
 
}
interface Visitor { public void visitStudent(Student student); // 访问学生 public void visitTeacher(Teacher teacher); // 访问老师 }
class Visitor1 implements Visitor { // 访问者1 分别统计学生和老师的年龄总和 private int studentAgeSum = 0; private int teacherAgeSum = 0;
 
 
public int getStudentAgeSum() {
    return studentAgeSum;
}

public int getTeacherAgeSum() {
    return teacherAgeSum;
}

@Override
public void visitStudent(Student student) {
    System.out.println("访问者1访问学生:" + student.getName() + " 年龄:" + student.getAge());
    studentAgeSum += student.getAge();
}

@Override
public void visitTeacher(Teacher teacher) {
    System.out.println("访问者1访问老师:" + teacher.getName() + " 年龄:" + teacher.getAge());
    teacherAgeSum += teacher.getAge();
}
 
 
}
class Visitor2 implements Visitor { // 访问者2 分别求出 学生的最高成绩 以及 老师的最高工龄 private int maxScore = -1; private int maxWorkYear = -1;
 
 
public int getMaxScore() {
    return maxScore;
}

public int getMaxWorkYear() {
    return maxWorkYear;
}

@Override
public void visitStudent(Student student) {
    System.out.println("访问者2访问学生:" + student.getName() + " 成绩:" + student.getScore());
    maxScore = Math.max(maxScore, student.getScore());
}

@Override
public void visitTeacher(Teacher teacher) {
    System.out.println("访问者2访问老师:" + teacher.getName() + " 工龄:" + teacher.getWorkYear());
    maxWorkYear = Math.max(maxWorkYear, teacher.getWorkYear());
}
 
 
}
class PersonStructure { private List personList = new ArrayList();
 
 
public PersonStructure() {
    personList.add(new Student("张三", 20, 70));
    personList.add(new Student("李四", 21, 80));
    personList.add(new Student("王五", 22, 90));

    personList.add(new Teacher("李老师", 26, 3));
    personList.add(new Teacher("陈老师", 27, 4));
    personList.add(new Teacher("刘老师", 28, 5));
}

public void Accept(Visitor visitor) {
    // for (遍历对象类型 对象名 : 遍历对象)
    for (Person person : personList) {
        person.Accept(visitor);
    }
}
 
 
}
abstract class Person { private String name; private int age;
 
 
public Person(String name, int age) {
    this.name = name;
    this.age = age;
}

public String getName() {
    return name;
}

public int getAge() {
    return age;
}

public abstract void Accept(Visitor visitor);
 
 
}
class Student extends Person { private int score;
 
 
public Student(String name, int age, int score) {
    super(name, age);

    this.score = score;
}

public int getScore() {
    return score;
}

@Override
public void Accept(Visitor visitor) {
    visitor.visitStudent(this);
}
 
 
}
class Teacher extends Person { private int workYear;
 
 
public Teacher(String name, int age, int workYear) {
    super(name, age);

    this.workYear = workYear;
}

public int getWorkYear() {
    return workYear;
}

@Override
public void Accept(Visitor visitor) {
    visitor.visitTeacher(this);
}
 
 
}
[14.中介者模式]

代码:

public class MediatorPattern { public static void main(String[] args) { ConcreteMediator mediator = new ConcreteMediator();
 
 
Colleague1 colleague1 = new Colleague1(mediator);
    Colleague2 colleague2 = new Colleague2(mediator);

    mediator.setColleague1(colleague1);
    mediator.setColleague2(colleague2);

    colleague1.sendMessage("软考加油");

    colleague2.sendMessage("祝大家软考顺利通过!");
}
 
 
}
abstract class Colleague { protected Mediator mediator; }
class Colleague1 extends Colleague { public Colleague1(Mediator mediator) { this.mediator = mediator; }
 
 
public void sendMessage(String message) {
    mediator.sendMessage(message, this);
}

public void Notify(String message) {
    System.out.println("同事1收到消息:" + message);
}
 
 
}
class Colleague2 extends Colleague { public Colleague2(Mediator mediator) { this.mediator = mediator; }
 
 
public void sendMessage(String message) {
    mediator.sendMessage(message, this);
}

public void Notify(String message) {
    System.out.println("同事2收到消息:" + message);
}
 
 
}
abstract class Mediator { public abstract void sendMessage(String message, Colleague colleague); }
class ConcreteMediator extends Mediator { private Colleague1 colleague1; private Colleague2 colleague2;
 
 
public void setColleague1(Colleague1 colleague1) {
    this.colleague1 = colleague1;
}

public void setColleague2(Colleague2 colleague2) {
    this.colleague2 = colleague2;
}

public void sendMessage(String message, Colleague colleague) {
    if (colleague == colleague1) {
        colleague2.Notify(message); // 让同事2收到消息
    } else {
        colleague1.Notify(message); // 让同事1收到消息
    }
}
 
 
}