1 创建型
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
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 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
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;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
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数据线" ) ;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
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 + ":蓝色" ) ;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
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 ;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
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 + "的职责:学习 " ) ;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
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 ( "执行子系统三的功能" ) ;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
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) ;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
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 ( "无法审批" ) ;
}
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
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) ;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
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 ( "老师:批改作业 打分数" ) ;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
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 ( "无法审批" ) ;
}
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
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 ( "电视机关机了..." ) ;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
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;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
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) ;
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
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 ++ ;
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
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) ;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
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 ( ) ) ;
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
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) ;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
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 ) ;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153