根据不同的抽象层次将系统组织为层次式结构,每个层次被建立为一个部件,不同的部件之间通常用程序调用的方式进行连接
该风格将系统组织为多个独立的对象,每个对象封装其内部的数据,并基于数据对外提供服务,不同的对象之间通过协作机制共同完成系统任务。
修改软件系统的严禁方法,在不改变代码外部表现的情况下改变其内部结构。重构发生在新功能增加完成后,用于消除新功能带来的负面影响
集成是将所有模块组合起来形成整个软件原型系统
持续集成是一种增量性集成,但其提倡尽早集成(不需等到模块开发完才集成,开发之初就利用stub集成)和频繁集成(每次完成一些开发任务,就用完成的程序替换)。
策略模式就是用来封装算法的,但是在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同业务规则,就可以考虑使用策略模式处理这种变化的可能性
适用的场景:
如果在一个系统里有很多类,他们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
一个系统需要动态地在许多行为中选择一种行为
如果一个对象有很多行为,如果不用恰当的模式,这种行为就只好使用多重的条件选择语句来实现
优点:
代码可扩展性,符合面向接口编程ISP
提供了可以替换继承关系的方法
避免多重条件转移语句
缺点:
客户端必须知道所有策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类
策略模式造成很多的策略类,每个具体策略类都会产生一个新类
一个软件实体应尽可能少地与其他实体发生相互作用
取款处理
ID:WithDrawProcess
参与人:用户(取款人),目标是能够尽可能快速地完成取款业务
触发条件:用户将银行卡插入卡槽
前置条件:所插入磁卡是本银行发行且有效状态的银行卡
后置条件:更新账户信息,准确读出取款陷阱至取款槽
正常流程:1.系统对插入卡槽的银行卡进行识别
2.系统显示用户操作界面
3.用户选择取款业务,系统上显示卡上余额
4.用户输入取款金额,系统更新账户信息,并读出相应现金
5.用户选择退卡,系统退回主界面,并动态更新银行基金宣传信息
扩展流程:1a.无效磁卡,吐出银行卡,并提示错误信息
3a.非法字符,系统提示错误并拒绝输入
3b.用户输入金额超过余额,系统提示并拒绝提款
4a.用户提款完成后,系统语音提示用户退卡,防止丢失
特殊需求:1.用户所有需求在3s内得到相应
2.初次使用ATM取款的用户也能快速完成取款业务
public class RationalNumber{
private int dividend;
private int divisor;
public RationalNumber(int dividend,int divisor){
if(divisor==0)throw new illegalArgumentException("分母不能为0");
this.dividend=dividend;
this.divisor=divisor;
}
getter setter
public RationalNumber SimpleFraction(RationNumber num){
int x=num.getDividend();
int y=num.getDivisor();
int largestCommonDivisor=getLargestCommonDivisor(x,y);
return new x/largestCommonDivisor,y/largestCommonDivisor
}
public int getLargestCommonDivisor(int x,int y){
x=Math.abs(x);
y=Math.abs(y);
int z=y;
whils(x%y!=0){
z=x%y;
x=y;
y=z;
}
return z;
}
public int getLeastCommonMultiple(int x,int y){
return (x*y)/getLargestCommonDivisor(x,y);
}
//加法
public RationalNumber add(RaionalNumber num){
int dividendOfNum1=this.getDividend();
int divisorOfNum1=this.getDivisor();
int dividendOfNum2=num.getDividend();
int divisorOfNum2=num.getDivisor();
int fenmu=getLeastCommonMultiple(divisorOfNum1,divisorOfNum2);
dividendOfNum1*=(fenmu/divisorOfNum1);
dividendOfNum2*=(fenmu/divisorOfNum2);
int fenzi=dividendOfNum1+dividendOfNum2;
RationalNUmber result = simpleFraction(new RationalNumber(fenzi,fenmu));
return result;
}
}
public class Square{
Rectangle rect;
double edge;
public Squre (double edge){
this.rect.setWidth(edge);
this.rect.setLength(edge);
}
public double getArea(){
return rect.getArea();
}
}
// 单一职责原则
public class Square{
public void draw(){
// 依赖GUI对象和GeometricSquare对象绘图
}
}
public GeometricSquare{
public double area(){
//求面积
}
}
public interface Factory{
public Employee createEmp(String name);
}
public class EmployeeFactory implements Factory{
public Employee createEmp(String name){
return new SalariedEmployee(name);
}
}
...
public class Department{
private List<Employee> employeeList;
private Factory factory;
...
public Employee addEmployee(String name){
Employee emp=factory.createEmp(name);
emp.setDepartment(this);
employeeList.add(emp);
update();
}
}
时间内聚考初始化
private Double getTotalSum(List amounts){
Double totalToPay=0.00;
Interator amountSIeterator = amount.iterator();
while(amountsIterator.hasNext){
Amount amount=(Amount) amountSIterator.next();
if(!cancelstatuses.contains(amount.getStatus())){
totalTopay+=amount.doubleValue();
}
}
return new Double(totalToPay);
}
private Double getTotalSumExcludeCancelAmount(List amout){
List newAmount=filter(amounts);
return getTotalSum(newAmounts);
}
private List filter(List amounts){
List res=new ArrayList();
Interator amountSIeterator = amount.iterator();
while(amountsIterator.hasNext()){
Amount amount=(Amount)amountIterator.next();
if(!amount.getIsToCancel()){
res.add(amount);
}
}
return res;
}
public class Sales{
SaleList salesList = new SaleList();
...
public double getCommdityPriceById(long CommidityId){
return saleList.getCommdityPrice(CommidityId);
}
}
public class SaleList{
HashMap<Integer, SalesLineItem>salesItemMap = new HashMap<Integer, SalesLineItem>();
public double getCommdityPriceBy(long CommidityId){
SalesLineItem item = salesItemMap.get(id);
return item.getCommodityPrice();
}
}
public class SaleLineList{
Commodity commodity;
...
public double getCommdityPriceBy(long CommidityId){
return commodity.getPrice();
}
}
public class Commodity{
double price;
...
public double getPrice(){
return price;
}
}
interface FlyBehavior{
public void fly();
}
class SubSonicFly implements FlyBehavior{
@Override
public void fly();
}
class SuperSonicFly implements FlyBehavior{
@Override
public void fly();
}
interface TakeOffBehavior{
public void takeOff();
}
class VerticalTakeOff implements TakeOffBehavior{
@Override
public void takeOff();
}
class LongDistanceTakeOff implements TakeOffBehavior{
@Override
public void takeOff();
}
abstract class AirCraft{
protected FlyBehavior flyBehavior;
protected TakeOffBehavior takeOffBehavior;
public void fly(){
flyBehavior.fly();
}
public void takeoff(){
flyBehavior.takeoff();
}
}
class AirPlane extends AirCraft{
public AirPlane(){
flyBehavior=new SubSonicFly();
takeOffBehavior=new VerticalTakeoff();
}
}
...
public interface ticket{
public int getPrice();
}
public class StudentTicket implements Ticket{
@Override
public int getPrice(){
return 30;
}
}
...