96SEO 2026-02-23 12:35 4
依赖它的对象都会得到通知并自动更新这里的对象指的是Observable目标依赖目标的对象是Observer观察者Observer观察者必须调用addObserver方法将Observer观察者注册到Observable目标的容器中Observable目标监听到事件发生会调用notify方法通知所有的Observer观察者自动更新观察者模式又叫做发布订阅模式它的优点是如果新增一个功能监听事件发生可以创建一个新的Observer观察者不需要修改Observable目标耦合性小

分析在点击页面的代码前后加上这两个逻辑硬编码如果不同公司的用户点击页面的行为不一样呢
优化思路采用观察者模式定义Observer接口每次添加一个逻辑会创建一个观察者对象观察者对象需要先注册到Customer对象中的容器然后调用notify方法会发布消息会循环调用每个观察者对象的update方法Java提供了Observer观察者对象和Observable目标
{customer.addObserver(observer);}customer.clickPage();}public
必须先设置changedtrue才会循环调用Observer的update方法//
Observable类的setChanged方法是protected只能在这个包下或者子类调用setChanged方法//
每个业务对变化的定义不同因此它是由子类判断是否变化super.setChanged();super.notifyObservers();}}public
{System.out.println(观察者Observer
{System.out.println(观察者Observer
发送一个验证消费者的地址);}}}Java包含了观察者模式的类Observer类是观察者Observable类是目标
创建WelcomeLetter、AddVerify两个Observer观察者对象重写update方法
创建Customer类继承Observable类创建clickPage方法当用户点击页面会先调用setChanged方法然后调用notifyObservers方法通知所有的观察者对象
}Observer接口包含update方法入参是Observable目标和参数arg
obs.toArray();clearChanged();}for
i--)((Observer)arrLocal[i]).update(this,
{obs.removeAllElements();}protected
}Observable类包含changed表示是否变化的标志和obs这个Vector容器它保存了Observer集合addObserver方法可以将Observer观察者对象添加到Vector容器中
notifyObservers方法会先判断changed必须是true才会复制Vector容器的元素到一个数组中然后从后向前逆序遍历数组并调用Observer观察者对象的update方法逆序是因为防止并发场景如果正序遍历在循环遍历的时候某个观察者对象从Vector容器中取消了会导致数组的索引变化了导致并发修改异常
setChanged方法是protected类型的因为每个业务都变化的定义都不相同因此可以创建一个子类继承Observable类自己定义什么时候需要调用setChanged方法表示数据变化了
ObservableFactory();ObservableFactory.Customer
Customer();ObservableFactory.WelcomeLetter
WelcomeLetter();ObservableFactory.AddVerify
ArrayList(2);list.add(welcomeLetter);list.add(addVerify);observableFactory.clickPage(customer,
}TaskController是创建Customer对象、WelcomeLetter、AddVerify调用clickPage方法可以发布并且观察者可以得到通知并自动更新
状态模式是对象有多种状态不同状态之间的变化封装在不同的状态类中思路是定义一个状态接口和多个状态实现类每个状态实现类都重写转换到其他状态的方法最后定义一个活动类通过map.get得到对应的状态类并调用方法
ActivityStartedState());map.put(暂停,
ActivityResumedState());map.put(结束,
{map.get(state).startActivity(this);}public
{map.get(state).resumeActivity(this);}public
{map.get(state).endActivity(this);}}public
{System.out.println(活动已经启动了不能重复启动);}Overridepublic
{System.out.println(活动暂停);activity.setState(暂停);System.out.println(state
activity.getState());}Overridepublic
{System.out.println(活动结束);activity.setState(结束);System.out.println(state
{System.out.println(活动重新启动);activity.setState(启动);System.out.println(state
activity.getState());}Overridepublic
{System.out.println(活动已经暂停了不能重复暂停);}Overridepublic
{System.out.println(活动结束);activity.setState(结束);System.out.println(state
{System.out.println(活动启动);activity.setState(启动);System.out.println(state
activity.getState());}Overridepublic
{System.out.println(活动已经结束不能暂停);}Overridepublic
{System.out.println(活动已经结束不能重复结束);}}}定义一个状态接口和多个状态实现类每个状态类都重写转换到其他状态的方法还定义了一个活动类封装了state状态表示活动的当前状态封装了一个Map可以存放不同的state和对应的状态对象通过map.get方法得到状态对象并调用状态对象的方法
StateFactory();StateFactory.Activity
Activity();activity.startActivity();activity.resumeActivity();activity.endActivity();
}创建一个活动对象活动对象的状态初始化是结束状态先调用活动对象的start方法可以从结束状态转换到启动状态然后调用活动对象的resume方法可以从启动状态转换到暂停状态最后调用活动对象的end方法可以从暂停状态转换到结束状态
责任链模式是允许多个对象都可以处理请求会将这些对象连成一个链直到有一个对象可以处理请求为止思路是定义一个抽象类组合一个对象因为每个对象都持有下一个对象的引用
{System.out.println(打印debug日志);}
{nextLogger.log(logLevel);}}}public
{System.out.println(打印info日志);}
{nextLogger.log(logLevel);}}}public
{System.out.println(打印error日志);}
{nextLogger.log(logLevel);}}}}定义一个抽象类它组合了下一个对象抽象方法log方法用来打印日志多个继承类可以重写log方法如果条件不满足就调用下一个对象的log方法
LoggerFactory();LoggerFactory.DebugLogger
DebugLogger();LoggerFactory.InfoLogger
InfoLogger();LoggerFactory.ErrorLogger
ErrorLogger();debugLogger.setNextLogger(infoLogger);infoLogger.setNextLogger(errorLogger);debugLogger.log(2);debugLogger.log(1);debugLogger.log(0);
}创建一个对象链如果这个对象满足条件会打印日志如果不满足条件会沿着对象链调用下一个对象的打印日志方法
第一个方法打印日志是error第二个方法打印日志是info第三个方法打印日志是debug
策略模式是定义多个算法它们可以相互替换定义一个抽象类和多个实现类寻找可变的参数并封装到这个抽象类中
优化思路计算税用一个抽象类定义一个抽象方法多个实现类重写这个方法就可以计算不同国家的税
price);System.out.println(calcTax.getClass()
1.5;}}}CalcTax抽象类和继承类都封装在SalesOrder类中CalcTax抽象类作为SalesOrder类的process方法的入参
USTax();salesOrder.process(usTax,
CanTax();salesOrder.process(canTax,
}TaskController类的f1方法创建SalesOrder类的对象和成员内部类的对象USTax和CanTax最后SalesOrder对象调用process方法入参传入成员内部类的对象USTax和CanTax
模板方法模式是定义算法的骨架将一些步骤推迟到子类中实现父类定义多个抽象方法子类实现这些抽象方法父类还定义了一个普通方法这个普通方法封装了这些抽象方法
优化思路创建一个抽象类封装了连接数据库的抽象方法和查询数据库的抽象方法还封装了一个普通方法这个普通方法封装了这些抽象方法每个数据库都创建一个实现类重写连接数据库的抽象方法和查询数据库的抽象方法
{queryDBTemplate.doQuery();}abstract
{getConnection();selectFromDB();}}public
{System.out.println(MysqlDB获取连接);}Overridepublic
{System.out.println(MysqlDB查询数据库的数据);}}public
{System.out.println(OracleDB获取连接);}Overridepublic
{System.out.println(OracleDB查询数据库的数据);}}}定义一个抽象类QueryDBTemplate定义抽象方法getConnection和selectFromDB抽象类中还定义了一个普通方法doQuerydoQuery方法封装了这两个抽象方法可以减少重复代码
QueryDBFactory();QueryDBFactory.QueryDBTemplate
MysqlDB();queryDBFactory.doQuery(queryDBTemplate);System.out.println();queryDBTemplate
OracleDB();queryDBFactory.doQuery(queryDBTemplate);}
模板模式在抽象类中定义普通方法是每个数据库都先获取连接然后查询数据库的数据
命令模式是将请求和执行解耦合使得请求不知道执行的具体实现用于封装操作并延迟执行这些操作思路是创建一个命令接口创建多个命令类实现这个接口命令类中组合了请求对象
{System.out.println(工作);}public
{System.out.println(运动);}public
{System.out.println(睡觉);}}public
{person.sleep();}}}创建一个命令接口Command创建多个实现类作为命令组合了Person对象
CommandFactory();CommandFactory.Person
Person();CommandFactory.WorkCommand
WorkCommand(person);CommandFactory.SportCommand
SportCommand(person);CommandFactory.SleepCommand
SleepCommand(person);workCommand.execute();sportCommand.execute();sleepCommand.execute();
迭代器模式是顺序遍历数组的所有元素不用关心数组的实现可以将遍历和数组的实现解耦合
arr[index];}}}通过迭代器遍历数组需要先创建迭代器接口创建一个类实现迭代器接口
String[]{a,b,c,d,e};IteratorFactory.Hobbies
{System.out.println(hobbies.next());}
中介者模式是用一个中介者对象封装对象之间的交互可以降低对象之间的耦合
{System.out.println(sender.getName()
msg);}}}用户对象之间的交互需要通过QQ这个中介者对象进行交互因此用户对象应该持有中介者对象QQ
MediatorFactory();MediatorFactory.QQ
备忘录模式是在破坏对象封装性的前提下恢复状态思路是创建备忘录对象来保存对象状态
memento.getState();}}}创建备忘录类MementoActivity活动类在修改活动状态的时候会返回备忘录对象通过restore方法可以恢复活动对象的状态
MementoFactory();MementoFactory.Activity
Activity();MementoFactory.Memento
activity.begin();MementoFactory.Memento
activity.resume();MementoFactory.Memento
activity.end();activity.restore(endMemento);System.out.println(activity.getState());activity.restore(resumeMemento);System.out.println(activity.getState());activity.restore(beginMemento);System.out.println(activity.getState());
}创建活动对象创建备忘录对象通过restore方法可以恢复活动状态
解释器模式是解释执行语言的表达式会将每个表达式抽象成一个类通过组合表达式可以构建复杂的表达式
number2.interpreter();}}}解释器模式会定义一个解释器接口定义数字解释器和相加操作的解释器重写interpreter方法
InterpreterFactory();InterpreterFactory.NumberInterpreter
NumberInterpreter(3);InterpreterFactory.NumberInterpreter
NumberInterpreter(6);InterpreterFactory.AddInterpreter
number2);System.out.println(addInterpreter.interpreter());
访问者模式是在不改变元素类的前提下定义这些元素的操作将数据结构和操作分离开使得操作可以独立的变化
{element1.log1();}Overridepublic
{visitor.visitElement1(this);}public
{System.out.println(打印元素1的日志);}}public
{visitor.visitElement2(this);}public
{System.out.println(打印元素2的日志);}}}定义元素定义访问者接口和实现类
VisitorFactory();VisitorFactory.Element1
Element1();VisitorFactory.Element2
Element2();VisitorFactory.RealVisitor
RealVisitor();element1.accept(realVisitor);element2.accept(realVisitor);
}调用元素的accept方法可以调用访问者visitor的方法
3里氏替换原则子类可以替换父类的方法保证程序运行正常子类可以实现父类没有的方法完成新增功能但是子类不应该重写父类的方法
fly()表示鸟类能够飞行。
如果我们按照里氏替换原则Penguin
方法好即不能飞要么导致错误或异常例如抛出不适当的异常则违反了里氏替换原则
类中移除因为企鹅并不符合“可以飞”的行为约定。
在这种情况下我们可能会创建一个
4依赖反转原则抽象不要依赖细节细节应该依赖抽象这里抽象指的是接口和抽象类
5接口隔离原则尽可能将一个接口拆分成多个小接口客户端不应该依赖它不需要的接口
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback