组合模式
Entry
public abstract class Entry {
public abstract String getName ( Entry file) ;
public abstract int getSize ( Entry file) ;
public abstract void printList ( ) ;
public abstract void add ( Entry file) ;
}
Directory
import java. util. ArrayList ;
public class Directory extends Entry {
private ArrayList < Entry > filelist= new ArrayList < Entry > ( ) ;
private String name;
public Directory ( String name) {
this . name= name;
}
@Override
public String getName ( Entry file) {
return name;
}
@Override
public int getSize ( Entry file) {
return 0 ;
}
@Override
public void printList ( ) {
System . out. println ( "****对文件夹 " + name+ "正被读取" ) ;
for ( Object obj: filelist) {
( ( Entry ) obj) . printList ( ) ;
}
}
@Override
public void add ( Entry file) {
filelist. add ( file) ;
}
}
File
public class File extends Entry {
private String name;
private int size;
public File ( String name, int size)
{
this . name = name;
this . size = size;
}
@Override
public String getName ( Entry file) {
return name;
}
@Override
public int getSize ( Entry file) {
return size;
}
@Override
public void printList ( ) {
System . out. println ( "文件名: " + name+ " 文件大小:" + size) ;
}
@Override
public void add ( Entry file) {
System . out. println ( "对不起,不支持该方法" ) ;
}
}
Main
public class Main {
public static void main ( String [ ] args) {
Entry file1, file2, file3, file4, file5, directory1, directory2, directory3, directory4;
directory1= new Directory ( "总资料" ) ;
directory2= new Directory ( "图像文件" ) ;
directory3 = new Directory ( "文本文件" ) ;
directory4 = new Directory ( "视频文件" ) ;
file1= new File ( "壁纸.jpg" , 110 ) ;
file2= new File ( "图文.jif" , 300 ) ;
file3= new File ( "网文.txt" , 90 ) ;
file4= new File ( "实验报告.doc" , 111 ) ;
file5= new File ( "电影.rmvb" , 1000 ) ;
directory2. add ( file1) ;
directory2. add ( file2) ;
directory3. add ( file3) ;
directory3. add ( file4) ;
directory4. add ( file5) ;
directory1. add ( directory2) ;
directory1. add ( directory3) ;
directory1. add ( directory4) ;
directory1. printList ( ) ;
}
}
装饰者模式
Decorator
package Decorator ;
public abstract class Display {
public abstract int getColumns ( ) ;
public abstract int getRows ( ) ;
public abstract String getRowText ( int row) ;
public void show ( )
{
for ( int i = 0 ; i < getRows ( ) ; i++ ) {
System . out. println ( getRowText ( i) ) ;
}
}
}
StringDisplay
package Decorator ;
public class StringDisplay extends Display {
private String string;
public StringDisplay ( String string)
{
this . string = string;
}
public int getColumns ( )
{
return string. length ( ) ;
}
public int getRows ( )
{
return 1 ;
}
public String getRowText ( int row)
{
if ( row == 0 )
return string;
else
return null ;
}
}
Border
package Decorator ;
public abstract class Border extends Display {
protected Display display;
protected Border ( Display display)
{
this . display = display;
}
}
SideBorder
package Decorator ;
public class SideBorder extends Border {
private char borderChar;
protected SideBorder ( Display display, char char1)
{
super ( display) ;
this . borderChar = char1;
}
public int getColumns ( )
{
return display. getColumns ( ) + 2 ;
}
public int getRows ( )
{
return display. getRows ( ) ;
}
public String getRowText ( int row)
{
return borderChar + display. getRowText ( row) + borderChar;
}
}
FullBorder
package Decorator ;
public class FullBorder extends Border {
public FullBorder ( Display display)
{
super ( display) ;
}
public int getColumns ( )
{
return display. getColumns ( ) + 2 ;
}
public int getRows ( )
{
return display. getRows ( ) + 2 ;
}
public String getRowText ( int row)
{
if ( row == 0 ) {
return '+' + makeLine ( '-' , display. getColumns ( ) ) + '+' ;
} else if ( row == display. getRows ( ) + 1 ) {
return '+' + makeLine ( '-' , display. getColumns ( ) ) + '+' ;
} else {
return '|' + display. getRowText ( row - 1 ) + '|' ;
}
}
private String makeLine ( char ch, int count)
{
StringBuilder bulider = new StringBuilder ( ) ;
for ( int i = 0 ; i < count; i++ ) {
bulider. append ( ch) ;
}
return bulider. toString ( ) ;
}
}
Main
package Decorator ;
public class Main {
public static void main ( String [ ] args) {
Display d1 = new StringDisplay ( "Hello, world." ) ;
d1. show ( ) ;
Display d2 = new SideBorder ( d1, '|' ) ;
d2. show ( ) ;
Display d3 = new FullBorder ( d2) ;
d3. show ( ) ;
}
}
职责链模式
Support
public abstract class Support {
private String name;
private Support next;
public Support ( String name) {
this . name = name;
}
public Support setNext ( Support next) {
this . next = next;
return next;
}
public final void support ( Trouble trouble) {
if ( resolve ( trouble) ) {
done ( trouble) ;
} else if ( next != null ) {
next. support ( trouble) ; } else {
fail ( trouble) ;
}
}
public abstract boolean resolve ( Trouble trouble) ;
protected void done ( Trouble trouble) {
System . out. println ( trouble + " is resolved by " + this + "." ) ;
}
protected void fail ( Trouble trouble) {
System . out. println ( trouble + " cannot be resolved." ) ;
}
@Override
public String toString ( ) {
return "[" + name + "]" ;
}
}
OddSupport
public class OddSupport extends Support {
public OddSupport ( String name) {
super ( name) ;
}
@Override
public boolean resolve ( Trouble trouble) {
if ( trouble. getNumber ( ) % 2 == 1 ) {
return true ;
}
return false ;
}
}
SpecialSupport
public class SpecialSupport extends Support {
private int number;
public SpecialSupport ( String name, int number) {
super ( name) ;
this . number = number;
}
@Override
public boolean resolve ( Trouble trouble) {
if ( number == trouble. getNumber ( ) ) {
return true ;
}
return false ;
}
}
Main
public class Main {
public static void main ( String [ ] args) {
Support alice = new NoSupport ( "Alice" ) ;
Support bob = new LimitSupport ( "Bob" , 100 ) ;
Support charlie = new SpecialSupport ( "Charlie" , 429 ) ;
Support diana = new LimitSupport ( "Diana" , 200 ) ;
Support elmo = new OddSupport ( "Elmo" ) ;
Support fred = new LimitSupport ( "Fred" , 300 ) ;
alice. setNext ( bob) . setNext ( charlie) . setNext ( diana) . setNext ( elmo) . setNext ( fred) ;
for ( int i = 0 ; i < 500 ; i += 33 ) {
alice. support ( new Trouble ( i) ) ;
}
}
}
迭代器模式
Iterator
public interface Iterator < T > {
boolean hasNext ( ) ;
T next ( ) ;
}
Aggregate
public interface Aggregate {
Iterator iterator ( ) ;
}
BookShelfIterator
public class BookShelfIterator implements Iterator < Book > {
private BookShelf bookShelf;
private Integer index;
public BookShelfIterator ( BookShelf bookShelf) {
this . bookShelf = bookShelf;
this . index = 0 ;
}
public boolean hasNext ( ) {
return index < bookShelf. length ( ) ;
}
public Book next ( ) {
return bookShelf. get ( index++ ) ;
}
}
BookShelf
import java. util. ArrayList ;
import java. util. List ;
public class BookShelf implements Aggregate {
private List < Book > books = new ArrayList < Book > ( ) ;
public Integer length ( ) {
return books. size ( ) ;
}
public Book get ( Integer index) {
return books. get ( index) ;
}
public void add ( Book book) {
books. add ( book) ;
}
public Iterator iterator ( ) {
return new BookShelfIterator ( this ) ;
}
}
Book
public class Book {
private String name;
public Book ( String name) {
this . name = name;
}
public String getName ( ) {
return name;
}
}
Main
public class Main {
public static void main ( String [ ] args) {
BookShelf bookShelf = new BookShelf ( ) ;
bookShelf. add ( new Book ( "Java" ) ) ;
bookShelf. add ( new Book ( "设计模式" ) ) ;
bookShelf. add ( new Book ( "计算机网络" ) ) ;
bookShelf. add ( new Book ( "数据结构" ) ) ;
bookShelf. add ( new Book ( "数学建模" ) ) ;
Iterator iterator = bookShelf. iterator ( ) ;
while ( iterator. hasNext ( ) ) {
Book next = ( Book ) iterator. next ( ) ;
System . out. println ( next. getName ( ) ) ;
}
}
}
观察者模式
Observer
public interface Observer {
void upadate ( NumberGenerator generator) ;
}
NumberGenerator
import java. util. ArrayList ;
import java. util. List ;
public abstract class NumberGenerator {
private List < Observer > observers = new ArrayList < > ( ) ;
public void addObserer ( Observer observer) {
observers. add ( observer) ;
}
public void deleteObserver ( Observer observer) {
observers. remove ( observer) ;
}
public void notifyObservers ( ) {
observers. forEach ( e -> e. upadate ( this ) ) ;
}
abstract int getNumber ( ) ;
abstract void execute ( ) ;
}
DigitObserver
import java. util. concurrent. TimeUnit ;
public class DigitObserver implements Observer {
@Override
public void upadate ( NumberGenerator generator) {
System . out. println ( "DigitObserver:" + generator. getNumber ( ) ) ;
try {
TimeUnit . MICROSECONDS . sleep ( 100 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
GraphObserver
import java. util. concurrent. TimeUnit ;
public class GraphObserver implements Observer {
@Override
public void upadate ( NumberGenerator generator) {
System . out. print ( "GraphObserver:" ) ;
int count = generator. getNumber ( ) ;
for ( int i = 0 ; i < count; i++ ) {
System . out. print ( '*' ) ;
}
System . out. println ( ) ;
try {
TimeUnit . MICROSECONDS . sleep ( 100 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
}
RandomNumberGenerator
import java. util. Random ;
public class RandomNumberGenerator extends NumberGenerator {
private Random random = new Random ( ) ;
private int number;
@Override
int getNumber ( ) {
return number;
}
@Override
void execute ( ) {
for ( int i = 0 ; i < 20 ; i++ ) {
number = random. nextInt ( 50 ) ;
notifyObservers ( ) ;
}
}
}
Main
public class Main {
public static void main ( String [ ] args) {
RandomNumberGenerator generator = new RandomNumberGenerator ( ) ;
Observer digitObserver = new DigitObserver ( ) ;
Observer graphObserver = new GraphObserver ( ) ;
generator. addObserer ( digitObserver) ;
generator. addObserer ( graphObserver) ;
generator. execute ( ) ;
}
}