软件构造复习的一些知识

复习用,所以可能有的部分就是按照自己能理解的写的,且没有顺序。
接口:
interface Out
{
void example1();
}

用类来实现接口,关键词implements
public class A implements Out
{
public void example1(){

}

}

public static void main(String[] args)
{
Out o = new A();
0.example1();
}

SRP:单一责任原则
OCP:开放/封闭原则
LSP:Liskov替换原则
ISP:接口隔离原则
DIP:依赖转置原则

委托(4-2P36)
一个对象请求另一个对象的功能
1)临时性的
2)永久性的
class RealPrinter {
void print() {
System.out.println(“The Delegate”);
}
}
class Printer {
RealPrinter p = new RealPrinter();\Printer调用了RealPrinter来使用它的print
void print() {
p.print();
}
}
Printer printer = new Printer();
printer.print();
一个类不需要继承另一个类的全部方法,可以通过委托机制调用部分方法,

几种设计模式
面向可复用性的
结构型模式
1)**Adapter:**解决接口不匹配:通过委托delegation完成
如图Client要用到LegacyRectangle
在这里插入图片描述
解决:
interface Shape {\把用户要用的接口暴露
void display(int x1, int y1, int x2, int y2);
}
class Rectangle implements Shape {\适配器:实现这个接口:调用用户想要使用的LegacyRectangle
void display(int x1, int y1, int x2, int y2) {
new LegacyRectangle().display(x1, y1, x2-x1, y2-y1);
}
}
class LegacyRectangle {
void display(int x1, int y1, int w, int h) {…}
}
class Client {\客户端
Shape shape = new Rectangle();
public display() {
shape.display(x1, y1, x2, y2);
}
}

2)**Decorator:**在对象的现有方法中动态添加/覆盖行为:同时使用子类型和委托
Decorator
3)**Facade:**为大量代码提供了一个简化的接口。4-3P31
行为类模式
4)Strategy:允许在运行时动态地选择一系列算法中的一个。
public interface PaymentStrategy{
public void pay(int amout);
}
public class StrategyA implements PaymentStartegy{
private String s1;
public StrategyA(String s1){
this.s1 = s1;
}
@Override
pay(int amount){

}
}
public class StrategyB implements PaymentStartegy{
private String s1;
private String s2;
public StrategyA(String s1, String s2){
this.s1 = s1;
this.s2 = s2;
}
@Override
pay(int amount){

}
}
public class ShoppingCart {\委托(临时的)

public void pay(PaymentStrategy paymentMethod){
int amount = calculateTotal();
paymentMethod.pay(amount);
}
}
在用户使用的时候如
ShoppingCart cart = new ShoppingCart();
cart.pay(new StrategyB(“aa”));
5)**Template method:**如框架,做事情的步骤一样,但具体方法不同,使用继承和重写实现。白盒框架。4-3P47
6)**Iterator:**按顺序访问对象的元素,而不公开其底层表示
Iterator

可维护性的设计模式
创建型模式
1)**Factory method pattern:**创建对象,而不指定要创建的确切类。每一类工厂只是创建某一种类型下的一个或多个产品。
Factory method pattern
2)**Abstract factory pattern:**每个工厂创建一类产品
Abstract factory pattern
结构模式
1)**Proxy:**加载一个代理的对象,真正用到这个对象的时候再去加载他。通过一个接口选择真实对象还是代理对象。
Proxy
行为模式
1)Observer: 5-2P35
Observer
2)**Visitor:**通过一个统一的接入点完成对不同的类的访问
Visitor

状态模式State-based programming:
State Pattern 5-3P18
Memento Pattern记住对象的历史状态,以便于“回滚”5-3P23
包含的类:
Orginator创建备忘录
Memento备忘录
Caretaker集合类存储备忘录
语法驱动的构造: Grammar-based construction
x::=y z
x::=y*
x::=y|z
用非终结符匹配更多的字符串,如图,.的前后都能匹配多种字符互传
在这里插入图片描述
但是这里匹配了非法的字符串 http://./,改变
在这里插入图片描述
但是太复杂了,所以可以用更多的操作符来完成:
x::= y? x是y或者是空字符串(0到1个y)
x::=y+ 等于x::= y y*(1到多个y)
x ::= [a-c] 等于x ::= ‘a’ | ‘b’ | ‘c’(选一个)
x ::= [^a-c] 等于x ::= ‘d’ | ‘e’ | ‘f’ | …(除了a-c选一个)
所以上一个例子可以写成:
ur1::=‘http://‘hostname’/’
hostname ::=word ‘.’ word
word :: =[a-z]+
#判断:root :: = ‘a’+ ‘b’* +‘c’?
aabcc错
bbbc错
aaaaaaa对
abc对
abab错
aac对
正则语法:左侧是非终结符,右侧没有非终结符
如下图不是
在这里插入图片描述
一些操作符
. 任何单个字符
\d [0-9]
\D [^0-9]
\s 任何空格字符,包括空格,制表符,换行符
\S 非\s
\w [a-zA-Z_0-9]
\W [^\w]
5-3P89
在Java中使用正则表达式
替换:
在这里插入图片描述
匹配:
在这里插入图片描述
提取:
在这里插入图片描述

断言Assertions
用在程序员写程序的阶段,用来检验假设是否成立运行阶段不用assertions
assert x>= 0:“x is” + x;
如果x=-1
则断言失败并出现错误消息x is -1
断言检测不变量等,可以用来检测前置条件和后置条件是否满足
默认情况下断言关闭,通过-ea选项开启
Assertions涵盖程序的正确性问题,处理不应该发生的情况
Exception健壮性,处理预料到可以发生的不正常情况
public方法的参数尽量用异常进行检测来保证健壮性

测试策略
并发
并发的程序是如何通信的:1.共享内存2.消息传递
进程只能通过1进行通信。
创建线程
1.从Thread类派生子类(不推荐)
2.从Runnable接口构造Thread对象。7-1P28
在这里插入图片描述
时间切片由OS自动调度
写在前面的线程不一定先执行
在这里插入图片描述
最后结果:如5,6,10,30,不会得如1,2
在这里插入图片描述
并发的错误很难debug,print语句甚至会导致bug消失所以不能通过print来把bug显示出来(因为print语句时间很长,改变时间切片情况)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值