@startuml package com.iluwatar.ruleengine { interface Rule { + name() : String {abstract} + evaluate(context : T) : boolean {abstract} + execute(context : T) : void {abstract} } class RuleEngine { - rules : List> + RuleEngine(rules : List>) + run(context : T) : RuleEngineResult + rules() : List> } class RuleEngineResult { + RuleEngineResult(approved : boolean, passedRules : List, failedRules : List) + approved() : boolean + passedRules() : List + failedRules() : List } class LoanApplication { + LoanApplication(age : int, monthlyIncome : double, loanAmount : double, creditScore : int) + age() : int + monthlyIncome() : double + loanAmount() : double + creditScore() : int } class MinimumAgeRule { - minimumAge : int + MinimumAgeRule(minimumAge : int) + name() : String + evaluate(context : LoanApplication) : boolean + execute(context : LoanApplication) : void } class MinimumIncomeRule { - minimumIncome : double + MinimumIncomeRule(minimumIncome : double) + name() : String + evaluate(context : LoanApplication) : boolean + execute(context : LoanApplication) : void } class CreditScoreRule { - minimumScore : int + CreditScoreRule(minimumScore : int) + name() : String + evaluate(context : LoanApplication) : boolean + execute(context : LoanApplication) : void } class App { + App() + main(args : String[]) : void } } RuleEngine --> "*" Rule RuleEngine ..> RuleEngineResult MinimumAgeRule ..|> Rule MinimumIncomeRule ..|> Rule CreditScoreRule ..|> Rule MinimumAgeRule ..> LoanApplication MinimumIncomeRule ..> LoanApplication CreditScoreRule ..> LoanApplication @enduml