1 创建型
1.0 简单工厂模式模式
public class SimpleFactory {
public static void main ( String [ ] args) {
Product productA = Factory . createProduct ( "A" ) ;
productA. info ( ) ;
Product productB = Factory . createProduct ( "B" ) ;
}
}
abstract class Product {
public abstract void info ( ) ;
}
class Factory {
public static Product createProduct ( String type) {
Product product = null ;
switch ( type) {
case "A" :
product = new ProductA ( ) ;
break ;
case "B" :
product = new ProductB ( ) ;
break ;
default :
System . out. println ( "没有 " + type + " 类型的产品!" ) ;
break ;
}
return product;
}
}
class ProductA extends Product {
@Override
public void info ( ) {
System . out. println ( "产品的信息:A" ) ;
}
}
class ProductB extends Product {
@Override
public void info ( ) {
System . out. println ( "产品的信息:B" ) ;
}
}
1.1 工厂方法模式(类)
public class FactoryMethod {
public static void main ( String [ ] args) {
Factory factoryA = new FactoryA ( ) ;
Product productA = factoryA. createProduct ( ) ;
productA. info ( ) ;
Factory factoryB = new FactoryB ( ) ;
Product productB = factoryB. createProduct ( ) ;
productB. info ( ) ;
}
}
interface Factory {
public Product createProduct ( ) ;
}
class FactoryA implements Factory {
@Override
public Product createProduct ( ) {
return new ProductA ( ) ;
}
}
class FactoryB implements Factory {
@Override
public Product createProduct ( ) {
return new ProductB ( ) ;
}
}
interface Product {
public void info ( ) ;
}
class ProductA implements Product {
@Override
public void info ( ) {
System . out. println ( "产品的信息:A" ) ;
}
}
class ProductB implements Product {
@Override
public void info ( ) {
System . out. println ( "产品的信息:B" ) ;
}
}
1.2 抽象工厂模式
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 ( ) ;
}
class ProductA1 implements ProductA {
@Override
public void info ( ) {
System . out. println ( "产品的信息:A1" ) ;
}
}
class ProductA2 implements ProductA {
@Override
public void info ( ) {
System . out. println ( "产品的信息:A2" ) ;
}
}
interface ProductB {
public void info ( ) ;
}
class ProductB1 implements ProductB {
@Override
public void info ( ) {
System . out. println ( "产品的信息:B1" ) ;
}
}
class ProductB2 implements ProductB {
@Override
public void info ( ) {
System . out. println ( "产品的信息:B2" ) ;
}
}
1.3生成器模式
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 < String > parts = new ArrayList < String > ( ) ;
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" ) ;
}
}
1.4原型模式
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 = ( 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;
}
}
1.5单例模式
public class SingletonPattern {
public static void main ( String [ ] args) {
Singleton singleton1 = Singleton . getInstance ( ) ;
Singleton singleton2 = Singleton . getInstance ( ) ;
Singleton singleton3 = Singleton . getInstance ( ) ;
System . out. println ( singleton1. getNumber ( ) + " " + singleton2. getNumber ( ) + " " + singleton3. getNumber ( ) ) ;
singleton1. setNumber ( 528 ) ;
System . out. println ( singleton1. getNumber ( ) + " " + singleton2. getNumber ( ) + " " + singleton3. getNumber ( ) ) ;
}
}
class Singleton {
private int number = 2022 ;
public void setNumber ( int number) {
this . number = number;
}
public int getNumber ( ) {
return number;
}
private static Singleton instance = new Singleton ( ) ;
private Singleton ( ) { }
public static Singleton getInstance ( ) {
return instance;
}
}
2 结构性
2.1 适配器模式(类/对象)
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数据线" ) ;
}
}
2.2 桥接模式
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 + ":蓝色" ) ;
}
}
2.3组合模式
import java. util. * ;
public class CompositePattern {
public static void main ( String [ ] args) {
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 ( AbstractFile children : childrenList) {
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 < AbstractFile > childrenList = new ArrayList < AbstractFile > ( ) ;
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 ;
}
}
2.4装饰模式
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 + "的职责:学习 " ) ;
}
}
2.5外观模式
public class FacadePattern {
public static void main ( String [ ] args) {
Facade facade = new Facade ( ) ;
facade. methodA ( ) ;
facade. methodB ( ) ;
facade. methodC ( ) ;
}
}
class Facade {
SubSystemOne subSystemOne;
SubSystemTwo subSystemTwo;
SubSystemThree subSystemThree;
public Facade ( ) {
subSystemOne = new SubSystemOne ( ) ;
subSystemTwo = new SubSystemTwo ( ) ;
subSystemThree = new SubSystemThree ( ) ;
}
public void methodA ( ) {
subSystemOne. methodOne ( ) ;
}
public void methodB ( ) {
subSystemTwo. methodTwo ( ) ;
}
public void methodC ( ) {
subSystemThree. methodThree ( ) ;
}
}
class SubSystemOne {
public void methodOne ( ) {
System . out. println ( "执行子系统一的功能" ) ;
}
}
class SubSystemTwo {
public void methodTwo ( ) {
System . out. println ( "执行子系统二的功能" ) ;
}
}
class SubSystemThree {
public void methodThree ( ) {
System . out. println ( "执行子系统三的功能" ) ;
}
}
2.6 享元模式
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) ;
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) ;
}
}
2.7 代理模式
public class ProxyPattern {
public static void main ( String [ ] args) {
RealSubject realSubject = new RealSubject ( ) ;
Proxy proxy = new Proxy ( realSubject) ;
proxy. buy ( ) ;
}
}
interface Subject {
public void buy ( ) ;
}
class Proxy implements Subject {
protected RealSubject realSubject;
public Proxy ( RealSubject realSubject) {
this . realSubject = realSubject;
}
@Override
public void buy ( ) {
System . out. println ( "办理购买前的手续" ) ;
realSubject. buy ( ) ;
System . out. println ( "办理购买后的手续" ) ;
}
}
class RealSubject implements Subject {
@Override
public void buy ( ) {
System . out. println ( "付钱" ) ;
}
}
13 责任链模式
public class ChainOfResponsibilityPattern {
public static void main ( String [ ] args) {
Handler fudaoyuan = new FuDaoYuan ( ) ;
Handler yuanzhang = new YuanZhang ( ) ;
Handler xiaozhang = new XiaoZhang ( ) ;
fudaoyuan. setNext ( yuanzhang) ;
yuanzhang. setNext ( xiaozhang) ;
fudaoyuan. HandlerRequest( 31 ) ;
}
}
abstract class Handler {
protected Handler next;
public void setNext ( Handler next) {
this . next = next;
}
public abstract void HandlerRequest ( int request) ;
}
class FuDaoYuan extends Handler {
@Override
public void HandlerRequest ( int request) {
if ( request <= 7 ) {
System . out. println ( "辅导员审批通过" ) ;
} else {
if ( next != null ) {
next. HandlerRequest( request) ;
} else {
System . out. println ( "无法审批" ) ;
}
}
}
}
class YuanZhang extends Handler {
@Override
public void HandlerRequest ( int request) {
if ( request <= 15 ) {
System . out. println ( "院长审批通过" ) ;
} else {
if ( next != null ) {
next. HandlerRequest( request) ;
} else {
System . out. println ( "无法审批" ) ;
}
}
}
}
class XiaoZhang extends Handler {
@Override
public void HandlerRequest ( int request) {
if ( request <= 30 ) {
System . out. println ( "校长审批通过" ) ;
} else {
if ( next != null ) {
next. HandlerRequest( request) ;
} else {
System . out. println ( "无法审批" ) ;
}
}
}
}
3 行为型
3.1 解释器模式(类)
import java. util. * ;
public class InterpreterPattern {
public static void main ( String [ ] args) {
Context context = new Context ( ) ;
context. check ( "A区的开发人员" ) ;
context. check ( "B区的调试人员" ) ;
context. check ( "C区的测试人员" ) ;
System . out. println ( "==========" ) ;
context. check ( "D区的程序员" ) ;
context. check ( "D区的测试员" ) ;
context. check ( "A区的程序员" ) ;
}
}
class Context {
private String [ ] regions = { "A区" , "B区" , "C区" } ;
private String [ ] persons = { "开发人员" , "测试人员" , "调试人员" } ;
private NonterminalExprssion nonterminal;
public Context ( ) {
TerminalExpression region = new TerminalExpression ( regions) ;
TerminalExpression person = new TerminalExpression ( persons) ;
nonterminal = new NonterminalExprssion ( region, person) ;
}
public void check ( String info) {
boolean bool = nonterminal. Interpret( info) ;
if ( bool) {
System . out. println ( "识别成功" ) ;
} else {
System . out. println ( "识别失败" ) ;
}
}
}
interface Expression {
public boolean Interpret ( String info) ;
}
class NonterminalExprssion implements Expression {
private TerminalExpression region;
private TerminalExpression person;
public NonterminalExprssion ( TerminalExpression region, TerminalExpression person) {
this . region = region;
this . person = person;
}
@Override
public boolean Interpret ( String info) {
String [ ] str = info. split ( "的" ) ;
return region. Interpret( str[ 0 ] ) && person. Interpret( str[ 1 ] ) ;
}
}
class TerminalExpression implements Expression {
private Set < String > set = new HashSet < > ( ) ;
public TerminalExpression ( String [ ] data) {
for ( String str : data) {
set. add ( str) ;
}
}
@Override
public boolean Interpret ( String info) {
return set. contains ( info) ;
}
}
3.2 模板方法模式(类)
public class TemplateMethodPattern {
public static void main ( String [ ] args) {
Person student = new Student ( ) ;
Person teacher = new Teacher ( ) ;
student. TemplateMethod( ) ;
System . out. println ( "=====我是分割线=====" ) ;
teacher. TemplateMethod( ) ;
}
}
abstract class Person {
public void TemplateMethod ( ) {
System . out. println ( "上课 去教室" ) ;
PrimitiveOperation1 ( ) ;
System . out. println ( "下课 离开教室" ) ;
PrimitiveOperation2 ( ) ;
}
public abstract void PrimitiveOperation1 ( ) ;
public abstract void PrimitiveOperation2 ( ) ;
}
class Student extends Person {
@Override
public void PrimitiveOperation1 ( ) {
System . out. println ( "学生:听课 学习 做笔记 提出问题" ) ;
}
@Override
public void PrimitiveOperation2 ( ) {
System . out. println ( "学生:写作业 提交作业" ) ;
}
}
class Teacher extends Person {
@Override
public void PrimitiveOperation1 ( ) {
System . out. println ( "老师:上课 讲课 解答问题 布置作业" ) ;
}
@Override
public void PrimitiveOperation2 ( ) {
System . out. println ( "老师:批改作业 打分数" ) ;
}
}
3.3 责任链模式
public class ChainOfResponsibilityPattern {
public static void main ( String [ ] args) {
Handler fudaoyuan = new FuDaoYuan ( ) ;
Handler yuanzhang = new YuanZhang ( ) ;
Handler xiaozhang = new XiaoZhang ( ) ;
fudaoyuan. setNext ( yuanzhang) ;
yuanzhang. setNext ( xiaozhang) ;
fudaoyuan. HandlerRequest( 31 ) ;
}
}
abstract class Handler {
protected Handler next;
public void setNext ( Handler next) {
this . next = next;
}
public abstract void HandlerRequest ( int request) ;
}
class FuDaoYuan extends Handler {
@Override
public void HandlerRequest ( int request) {
if ( request <= 7 ) {
System . out. println ( "辅导员审批通过" ) ;
} else {
if ( next != null ) {
next. HandlerRequest( request) ;
} else {
System . out. println ( "无法审批" ) ;
}
}
}
}
class YuanZhang extends Handler {
@Override
public void HandlerRequest ( int request) {
if ( request <= 15 ) {
System . out. println ( "院长审批通过" ) ;
} else {
if ( next != null ) {
next. HandlerRequest( request) ;
} else {
System . out. println ( "无法审批" ) ;
}
}
}
}
class XiaoZhang extends Handler {
@Override
public void HandlerRequest ( int request) {
if ( request <= 30 ) {
System . out. println ( "校长审批通过" ) ;
} else {
if ( next != null ) {
next. HandlerRequest( request) ;
} else {
System . out. println ( "无法审批" ) ;
}
}
}
}
3.4 命令模式
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 ( "电视机关机了..." ) ;
}
}
3.5 迭代器模式
import java. util. * ;
public class IteratorPattern {
public static void main ( String [ ] args) {
BookAggregate bookAggregate = new BookAggregate ( ) ;
String [ ] books = { "数据结构" , "操作系统" , "计算机网络" , "计算机组成原理" } ;
double [ ] prices = { 10.24 , 20.48 , 40.96 , 81.92 } ;
for ( int i = 0 ; i < 4 ; i ++ ) {
bookAggregate. Add( new Book ( books[ i] , prices[ i] ) ) ;
}
Iterator bookIterator = bookAggregate. CreateIterator( ) ;
while ( bookIterator. hasNext ( ) ) {
Book book = ( Book ) bookIterator. next ( ) ;
System . out. println ( book. getName ( ) + " " + book. getPrice ( ) ) ;
}
}
}
interface Iterator {
public boolean hasNext ( ) ;
public Object next ( ) ;
}
class BookIterator implements Iterator {
private int index;
private BookAggregate bookAggregate;
public BookIterator ( BookAggregate bookAggregate) {
this . index = 0 ;
this . bookAggregate = bookAggregate;
}
@Override
public boolean hasNext ( ) {
if ( index < bookAggregate. getSize ( ) ) {
return true ;
} else {
return false ;
}
}
@Override
public Object next ( ) {
Object obj = bookAggregate. get ( index) ;
index ++ ;
return obj;
}
}
interface Aggregate {
public Iterator CreateIterator ( ) ;
}
class BookAggregate implements Aggregate {
private List < Book > list = new ArrayList < Book > ( ) ;
public void Add ( Book book) {
list. add ( book) ;
}
public Book get ( int index) {
return list. get ( index) ;
}
public int getSize ( ) {
return list. size ( ) ;
}
@Override
public Iterator CreateIterator ( ) {
return new BookIterator ( this ) ;
}
}
class Book {
private String name;
private double price;
public Book ( String name, double price) {
this . name = name;
this . price = price;
}
public String getName ( ) {
return name;
}
public double getPrice ( ) {
return price;
}
}
3.6 中介者模式
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) ;
} else {
colleague1. Notify( message) ;
}
}
}
3.7 备忘录模式
import java. util. * ;
public class MementoPattern {
public static void main ( String [ ] args) {
Caretaker caretaker = new Caretaker ( ) ;
Originator originator = new Originator ( ) ;
originator. setState ( "1024" ) ;
Memento backup1 = originator. createMemento ( ) ;
caretaker. addMemento ( backup1) ;
originator. setState ( "2048" ) ;
Memento backup2 = originator. createMemento ( ) ;
caretaker. addMemento ( backup2) ;
originator. setState ( "4096" ) ;
Memento backup3 = originator. createMemento ( ) ;
caretaker. addMemento ( backup3) ;
System . out. println ( originator. getState ( ) ) ;
caretaker. showMemento ( ) ;
Memento memento1 = caretaker. getMemento ( 2 ) ;
originator. setMemento ( memento1) ;
System . out. println ( "根据第2次备份还原之后的状态为:" + originator. getState ( ) ) ;
}
}
class Originator {
private String state;
public void setState ( String state) {
this . state = state;
}
public String getState ( ) {
return state;
}
public Memento createMemento ( ) {
return new Memento ( state) ;
}
public void setMemento ( Memento memento) {
state = memento. getState ( ) ;
}
}
class Memento {
private String state;
public Memento ( String state) {
this . state = state;
}
public String getState ( ) {
return state;
}
}
class Caretaker {
private List < Memento > mementoList = new ArrayList < > ( ) ;
public void addMemento ( Memento memento) {
mementoList. add ( memento) ;
}
public Memento getMemento ( int index) {
if ( index >= 1 && index <= mementoList. size ( ) ) {
return mementoList. get ( index - 1 ) ;
}
return null ;
}
public void showMemento ( ) {
int cnt = 1 ;
for ( Memento memento : mementoList) {
System . out. println ( "第" + cnt + "次备份,状态为:" + memento. getState ( ) ) ;
cnt ++ ;
}
}
}
3.8 观察者模式
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 ( 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) ;
}
}
3.9 状态模式
public class StatePattern {
public static void main ( String [ ] args) {
Context context = new Context ( ) ;
System . out. println ( context. getState ( ) ) ;
context. Request( ) ;
context. Request( ) ;
context. Request( ) ;
System . out. println ( context. getState ( ) ) ;
context. Request( ) ;
System . out. println ( context. getState ( ) ) ;
context. Request( ) ;
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 ( ) ) ;
}
}
}
3.10 策略模式
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) ;
}
}
3.11 访问者模式
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 {
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 {
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 < Person > personList = new ArrayList < Person > ( ) ;
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 ( 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 ) ;
}
}