1.state状态
考虑代码中出现许多if ~else if~else if~~或者switch语句时,可使用。
- /**
- * State类,抽象状态类,定义一个接口以封装
- * 与Context的一个特定状态相关的行为。
- * @author Andy
- *
- */
- public abstract class State {
- protected Account account;
- protected double balance;
- protected double interest;
- protected double lowerLimit;
- protected double upperLimit;
- //-------------Properties------------------//
- public Account getAccount() {
- return account;
- }
- public void setAccount(Account account) {
- this.account = account;
- }
- public double getBalance() {
- return balance;
- }
- public void setBalance(double balance) {
- this.balance = balance;
- }
- //------------------------------------------//
- /**存入金额*/
- public abstract void deposit(double amount);
- /**支出金额*/
- public abstract void withdraw(double amount);
- /**利息*/
- public abstract void payInterest();
- }
- /**
- * 用户账户状态:RedState
- * @author Andy
- * ConcreteState类,具体状态,每一个子类实现一个与
- * Context的一个状态相关的行为。
- */
- public class RedState extends State {
- private double serviceFee;
- public RedState(State state) {
- this.balance = state.getBalance();
- this.account = state.getAccount();
- initialize();
- }
- /** 模拟初始化基础数据*/
- private void initialize() {
- interest = 0.0;
- lowerLimit = -100.0;
- upperLimit = 0.0;
- serviceFee = 15.00;
- }
- @Override
- public void deposit(double amount) {
- balance += amount;
- stateChangeCheck();
- }
- @Override
- public void withdraw(double amount) {
- amount = amount - serviceFee;
- System.out.println("No funds available for withdrawal!");
- }
- @Override
- public void payInterest() {
- // No interest is paid
- }
- /** 状态检测 */
- private void stateChangeCheck() {
- if (balance > upperLimit) {
- account.setState(new SilverState(this));
- }
- }
- }
- /**
- * 用户账户状态:SilverState
- * @author Andy
- * ConcreteState类,具体状态,每一个子类实现一个与
- * Context的一个状态相关的行为。
- */
- public class SilverState extends State {
- public SilverState(State state){
- this(state.balance,state.account);
- }
- public SilverState(double balance, Account account){
- this.balance = balance;
- this.account = account;
- initialize();
- }
- /** 模拟初始化基础数据*/
- private void initialize(){
- interest = 0.0;
- lowerLimit = 0.0;
- upperLimit = 1000.0;
- }
- @Override
- public void deposit(double amount) {
- balance += amount;
- stateChangeCheck();
- }
- @Override
- public void withdraw(double amount) {
- balance -= amount;
- stateChangeCheck();
- }
- @Override
- public void payInterest() {
- balance += interest * balance;
- stateChangeCheck();
- }
- /** 状态检测 */
- private void stateChangeCheck(){
- if (balance < lowerLimit){
- account.setState(new RedState(this));
- }
- else if (balance > upperLimit){
- account.setState(new GoldState(this));
- }
- }
- }
- /**
- * 用户账户状态:GoldState
- * @author Andy
- * ConcreteState类,具体状态,每一个子类实现一个与
- * Context的一个状态相关的行为。
- */
- public class GoldState extends State {
- public GoldState(State state){
- this(state.balance, state.account);
- }
- public GoldState(double balance, Account account){
- this.balance = balance;
- this.account = account;
- initialize();
- }
- /** 模拟初始化基础数据*/
- private void initialize(){
- interest = 0.05;
- lowerLimit = 1000.0;
- upperLimit = 10000000.0;
- }
- @Override
- public void deposit(double amount) {
- balance += amount;
- stateChangeCheck();
- }
- @Override
- public void withdraw(double amount) {
- balance -= amount;
- stateChangeCheck();
- }
- @Override
- public void payInterest() {
- balance += interest * balance;
- stateChangeCheck();
- }
- /** 状态检测 */
- private void stateChangeCheck() {
- if (balance < 0.0) {
- account.setState(new RedState(this));
- } else if (balance < lowerLimit) {
- account.setState(new SilverState(this));
- }
- }
- }
- /**
- * Context类,维护一个ConcreteState子类的实例
- * 这个实例定义当前的状态。
- * @author Andy
- *
- */
- public class Account {
- private State state;
- private String owner;
- public Account(String owner){
- // 新开账户默认为 Silver状态
- this.owner = owner;
- this.state = new SilverState(0.0, this);
- }
- public State getState() {
- return state;
- }
- public void setState(State state) {
- this.state = state;
- }
- public void deposit(double amount) {
- state.deposit(amount);
- System.out.println(owner + " Deposited " + amount);
- System.out.println(owner + " Balance = " + state.getBalance());
- System.out.println("Status = " + state.getClass().getSimpleName());
- System.out.println("==============================================");
- }
- public void withdraw(double amount){
- state.withdraw(amount);
- System.out.println(owner + " Withdrew " + amount);
- System.out.println(owner + " Balance = " + state.getBalance());
- System.out.println("Status = " + state.getClass().getSimpleName());
- System.out.println("==============================================");
- }
- public void payInterest(){
- state.payInterest();
- System.out.println(owner + " Interest Paid ");
- System.out.println(owner + " Balance = " + state.getBalance());
- System.out.println("Status = " + state.getClass().getSimpleName());
- System.out.println("==============================================");
- }
- }
- public class StateClient {
- public static void main(String[] args) {
- // 新开一个银行账户
- Account account = new Account("Andy.Chen");
- // 存取款等系列操作
- account.deposit(500.0);
- account.deposit(300.0);
- account.deposit(550.0);
- account.payInterest();
- account.withdraw(2000.00);
- account.withdraw(1100.00);
- }
- }
2.strategy策略
考虑一个功能的多种算法实现,如排序。
#ifndef _STRATEGY_H_ 2 #define _STRATEGY_H_ 3 4 class Strategy 5 { 6 public: 7 ~Strategy(); 8 virtual void AlgrithmInterface()=0; 9 protected: 10 Strategy(); 11 private: 12 }; 13 14 class ConcreteStrategyA : public Strategy 15 { 16 public: 17 ConcreteStrategyA(); 18 ~ConcreteStrategyA(); 19 virtual void AlgrithmInterface(); 20 protected: 21 private: 22 }; 23 24 class ConcreteStrategyB : public Strategy 25 { 26 public: 27 ConcreteStrategyB(); 28 ~ConcreteStrategyB(); 29 virtual void AlgrithmInterface(); 30 protected: 31 private: 32 }; 33 34 /*这个类是Strategy模式的关键, 35 也是Strategy模式和Template模式的根本区别所在。 36 *Strategy通过“组合”(委托)方式实现算法(实现)的异构, 37 而Template模式则采取的是继承的方式 38 这两个模式的区别也是继承和组合两种实现接口重用的方式的区别 39 */ 40 class Context 41 { 42 public: 43 Context(Strategy*); 44 ~Context(); 45 void DoAction(); 46 private: 47 Strategy* _strategy; 48 }; 49 #endif
1 #include "Strategy.h" 2 #include "iostream" 3 4 using namespace std; 5 6 Strategy::Strategy() 7 {} 8 9 Strategy::~Strategy() 10 {} 11 12 ConcreteStrategyA::ConcreteStrategyA() 13 {} 14 15 ConcreteStrategyA::~ConcreteStrategyA() 16 {} 17 18 void ConcreteStrategyA::AlgrithmInterface() 19 { 20 cout << "ConcreteStrategyA::AlgrithmInterface" << endl; 21 } 22 23 ConcreteStrategyB::ConcreteStrategyB() 24 {} 25 26 ConcreteStrategyB::~ConcreteStrategyB() 27 {} 28 29 void ConcreteStrategyB::AlgrithmInterface() 30 { 31 cout << "ConcreteStrategyB::AlgrithmInterface" << endl; 32 } 33 34 Context::Context(Strategy* strategy) 35 { 36 this->_strategy = strategy; 37 } 38 39 Context::~Context() 40 { 41 delete this->_strategy; 42 } 43 44 void Context::DoAction() 45 { 46 this->_strategy->AlgrithmInterface(); 47 }
1 #include "Strategy.h" 2 3 int main() 4 { 5 /* 6 Strategy模式和Template模式实际是实现一个抽象接口的两种方式:继承和组合之间的区别。 7 要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放在具体子类中。 8 组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象接口放在组合类中。 9 这两种方式各有优缺点 10 */ 11 //策略A与B可替换 12 Strategy* pStr = new ConcreteStrategyA(); 13 Context* pcon = new Context(pStr); 14 pcon->DoAction(); 15 16 pStr = new ConcreteStrategyB(); 17 pcon = new Context(pStr); 18 pcon->DoAction(); 19 20 return 0; 21 }
3.template method模板方法
使用继承,达到多种实现
1 #ifndef _TEMPLATEMETHOD_H_ 2 #define _TEMPLATEMETHOD_H_ 3 4 //抽象模板,并定义了一个模板方法。 5 class AbstractClass 6 { 7 public: 8 ~AbstractClass(); 9 //具体的模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们都推迟到子类中实现 10 void TemplateMethod(); 11 //一些抽象行为,放到子类中去实现 12 virtual void PrimitiveOperation1()=0; 13 virtual void PrimitiveOperation2()=0; 14 protected: 15 AbstractClass(); 16 private: 17 }; 18 19 //实现基类所定义的抽象方法 20 class ConcreteClassA : public AbstractClass 21 { 22 public: 23 ConcreteClassA(); 24 ~ConcreteClassA(); 25 //实现基类定义的抽象行为 26 virtual void PrimitiveOperation1(); 27 virtual void PrimitiveOperation2(); 28 private: 29 }; 30 31 //实现基类所定义的抽象方法 32 class ConcreteClassB : public AbstractClass 33 { 34 public: 35 ConcreteClassB(); 36 ~ConcreteClassB(); 37 //实现基类定义的抽象行为 38 virtual void PrimitiveOperation1(); 39 virtual void PrimitiveOperation2(); 40 private: 41 }; 42 #endif
1 #include "TemplateMethod.h" 2 #include <iostream> 3 4 using namespace std; 5 6 AbstractClass::AbstractClass() 7 {} 8 9 AbstractClass::~AbstractClass() 10 {} 11 12 void AbstractClass::TemplateMethod() 13 { 14 this->PrimitiveOperation1(); 15 this->PrimitiveOperation2(); 16 } 17 18 ConcreteClassA::ConcreteClassA() 19 {} 20 21 ConcreteClassA::~ConcreteClassA() 22 {} 23 24 void ConcreteClassA::PrimitiveOperation1() 25 { 26 cout << "ConcreteClassA::PrimitiveOperation1" << endl; 27 } 28 29 void ConcreteClassA::PrimitiveOperation2() 30 { 31 cout << "ConcreteClassA::PrimitiveOperation2" << endl; 32 } 33 34 ConcreteClassB::ConcreteClassB() 35 {} 36 37 ConcreteClassB::~ConcreteClassB() 38 {} 39 40 void ConcreteClassB::PrimitiveOperation1() 41 { 42 cout << "ConcreteClassB::PrimitiveOperation1" << endl; 43 } 44 45 void ConcreteClassB::PrimitiveOperation2() 46 { 47 cout << "ConcreteClassB::PrimitiveOperation2" << endl; 48 }
1 #include "TemplateMethod.h" 2 3 int main() 4 { 5 //ConcreteClassA与ConcreteClassB可相互替换 6 AbstractClass* pAbstract = new ConcreteClassA(); 7 pAbstract->TemplateMethod(); 8 9 pAbstract = new ConcreteClassB(); 10 pAbstract->TemplateMethod(); 11 12 return 0; 13 }
4.visitor访问者
考虑类似集合的对象组,通过访问者操作
// "Visitor"
abstract class Visitor
{
// Methods
abstract public void VisitConcreteElementA(
ConcreteElementA concreteElementA );
abstract public void VisitConcreteElementB(
ConcreteElementB concreteElementB );
}
// "ConcreteVisitor1"
class ConcreteVisitor1 : Visitor
{
// Methods
override public void VisitConcreteElementA(
ConcreteElementA concreteElementA )
{
Console.WriteLine( "{0} visited by {1}",
concreteElementA, this );
}
override public void VisitConcreteElementB(
ConcreteElementB concreteElementB )
{
Console.WriteLine( "{0} visited by {1}",
concreteElementB, this );
}
}
// "ConcreteVisitor2"
class ConcreteVisitor2 : Visitor
{
// Methods
override public void VisitConcreteElementA(
ConcreteElementA concreteElementA )
{
Console.WriteLine( "{0} visited by {1}",
concreteElementA, this );
}
override public void VisitConcreteElementB(
ConcreteElementB concreteElementB )
{
Console.WriteLine( "{0} visited by {1}",
concreteElementB, this );
}
}
// "Element"
abstract class Element
{
// Methods
abstract public void Accept( Visitor visitor );
}
// "ConcreteElementA"
class ConcreteElementA : Element
{
// Methods
override public void Accept( Visitor visitor )
{
visitor.VisitConcreteElementA( this );
}
public void OperationA()
{
}
}
// "ConcreteElementB"
class ConcreteElementB : Element
{
// Methods
override public void Accept( Visitor visitor )
{
visitor.VisitConcreteElementB( this );
}
public void OperationB()
{
}
}
// "ObjectStructure"
class ObjectStructure
{
// Fields
private ArrayList elements = new ArrayList();
// Methods
public void Attach( Element element )
{
elements.Add( element );
}
public void Detach( Element element )
{
elements.Remove( element );
}
public void Accept( Visitor visitor )
{
foreach( Element e in elements )
e.Accept( visitor );
}
}
/// <summary>
/// Client test
/// </summary>
public class Client
{
public static void Main( string[] args )
{
// Setup structure
ObjectStructure o = new ObjectStructure();
o.Attach( new ConcreteElementA() );
o.Attach( new ConcreteElementB() );
// Create visitor objects
ConcreteVisitor1 v1 = new ConcreteVisitor1();
ConcreteVisitor2 v2 = new ConcreteVisitor2();
// Structure accepting visitors
o.Accept( v1 );
o.Accept( v2 );
}
}