State () ;
Strategy () ;
Template Method ( ) , , ;
Visitor () , .
Command
-, , . .
- , , .
. 5.11. Command
/* # 27: : Command.java: AddCommand.java: MultCommand.java */
package chapt05.command;
public abstract class Command {
public abstract void execute();
}
package chapt05.command;
import chapt05.receiver.*;
public class MultCommand extends Command {
private ArrayOperation ao;
public MultCommand (ArrayOperation ao) {
this. ao = ao;
}
public void execute () {
this. ao.product();
}
}
package chapt05.command;
import chapt05.receiver.*;
public class AddCommand extends Command {
private ArrayOperation ao;
public AddCommand (ArrayOperation ao) {
this. ao = ao;
}
public void execute() {
this. ao.sum();
}
}
/* # 28: Receiver () - : ArrayOperation.java */
package chapt05.receiver;
public class ArrayOperation {
private int [] mass;
public ArrayOperation(int [] mass) {
this. mass = mass;
}
public void sum() {
int sum = 0;
for (int i: mass)
sum += i;
System. out. println(sum);
}
public void product() {
int mult = 1;
for (int i: mass)
mult *= i;
System. out. println(mult);
}
}
/* # 29: Invoker ()- : ManagerCommands.java */
package chapt05.invoker;
import chapt05.command.*;
public class ManagerCommands {
private Command command;
public ManagerCommands(Command command) {
this. command = command;
}
public void setManager(Command command) {
this. command = command;
}
public void exec() {
command.execute();
}
}
/* # 30: Command: Main.java */
package chapt05;
import chapt05.invoker.*;
import chapt05.receiver.*;
import chapt05.command.*;
public class Main {
public static void main(String[] args) {
int mass[] = {-1, 71, 45, -20, 48, 60, 19};
/* (Receiver)-
*/
ArrayOperation receiver = new ArrayOperation (mass);
//
|
|
Command operation1 = new MultCommand(receiver);
Command operation2 = new AddCommand(receiver);
// (Invoker)-
ManagerCommands manager = new ManagerCommands(operation1);
manager.exec();
manager.setManager(operation2);
manager.exec();
}
}
- . . ManagerCommands . -.
Strategy
, . , .
. 5.12. Strategy
Operation , Sorting , SortByMax SortByMin. Sorting SortByXxx, Operation , Operation , .
. . - .
/* # 31: :
Operation.java: SortByMax.java: SortByMin.java */
package chapt05.strategy;
public abstract class Operation {
public abstract void sort(int mass[]);
}
package chapt05.strategy;
public class SortByMax extends Operation {
public void sort(int mass[]) {
for (int i = 0; i < mass.length; ++i) { for (int j = i; j < mass.length; ++j) {
if (mass[j] > mass[i]){
int m = mass[i];
mass[i] = mass[j];
mass[j] = m;
}
}
}
System. out. print("SortByMax: ");
for (int i: mass)
System. out. print(i + " ");
System. out. println('\n'); }
}
package chapt05.strategy;
public class SortByMin extends Operation {
public void sort(int mass[]) {
for (int i = 0; i < mass.length; ++i) { for (int j = i; j < mass.length; ++j) {
if (mass[j] < mass[i]){
int m = mass[i];
mass[i] = mass[j];
mass[j] = m;
}
}
}
System. out. print("SortByMin: ");
for (int i: mass)
System. out. print(i + " ");
System. out. println('\n');}
}
/* # 32: : Sorting.java */
package chapt05.strategy;
public class Sorting {
private Operation operation = null;
public Sorting(int operation){
switch (operation) {
case 1: this. operation = new SortByMax();
break;
case 2: this. operation = new SortByMin();
break;
default: System. out. println(
" "); }
}
public void sorting(int [] mass) {
if (operation!= null) operation.sort(mass);
else return;
}
}
/* # 33: Strategy: Main.java */
package chapt05.strategy;
public class Main {
public static void main(String args[]) {
int mass[] = {28, 9, 71, 8, 35, 5, 51};
|
|
Sorting cont1 = new Sorting(1);
Sorting cont2 = new Sorting(2);
cont1.sorting(mass);
cont2.sorting(mass);
}
}
Observer
, . Java Listener.
. 5.13. Observer
Rectangle () . OperationObserver () , . Perimeter ( ) Rectangle, , OperationObserver .
. , Observer . , , -.
/* # 34: -, -:
Rectangle.java */
package chapt05.observer;
import java.util.*;
public class Rectangle {
private float width;
private float height;
private ArrayList<OperationObserver> observerList =
new ArrayList<OperationObserver>();
public Rectangle(float width, float height) {
this. width = width;
this. height = height;
}
public void addObserver(OperationObserver observer) {
observerList.add(observer);
}
public float getWidth() {
return width;
}
public float getHeight() {
return height;
}
public void setWidth(float width) {
this. width = width;
notifyObservers();
}
public void setHeight(float height) {
this. height = height;
notifyObservers();
}
private void notifyObservers() {
Iterator it = observerList.iterator();
while (it.hasNext()) {
((OperationObserver) it.next()).valueChanged(this);
}
}
public String toString() {
String s = "";
Iterator it = observerList.iterator();
while (it.hasNext()) {
s = s +
((OperationObserver) it.next()).toString() + '\n';
}
return s;
}
}
Perimeter Square
OperationObserver .
Rectangle , .
/* # 35: -: OperationObserver.java: Square.java:
Perimeter.java */
package chapt05.observer;
public abstract class OperationObserver {
public abstract float valueChanged(Rectangle observed);
}
package chapt05.observer;
public class Perimeter extends OperationObserver {
private float perimeter;
public float valueChanged(Rectangle observed) {
return perimeter =
2 * (observed.getWidth() + observed.getHeight());
}
public String toString() {
return "P = " + perimeter;
}
}
package chapt05.observer;
public class Square extends OperationObserver {
private float square;
public float valueChanged(Rectangle observed) {
return square =
observed.getWidth() * observed.getHeight();
}
public String toString() {
return "S = " + square;
}
}
/* # 36: Observer: Main.java */
package chapt05.observer;
public class Main {
public static void main(String args[]) {
Rectangle observed = new Rectangle(5, 3);
System. out. println(observed.toString());
observed.addObserver(new Square());
observed.addObserver(new Perimeter());
observed.setWidth(10);
System. out. println(observed.toString());
observed.setHeight(8);
System. out. println(observed.toString());
}
}